Java 持久化之 -- IO 全面整理(看了絕不后悔)


 

目錄:

 

一、java io 概述

什么是IO

IO包括輸入流和輸出流,輸入流指的是將數據以字符或者字節形式讀取到內存 分為字符輸入流和字符輸入流

輸入流指的是從內存讀取到外界 ,分為字符輸入流和字節輸出流

Java IO即Java 輸入輸出系統。不管我們編寫何種應用,都難免和各種輸入輸出相關的媒介打交道,其實和媒介進行IO的過程是十分復雜的,這要考慮的因素特別多,比如我們要考慮和哪種媒介進行IO(文件、控制台、網絡),我們還要考慮具體和它們的通信方式(順序、隨機、二進制、按字符、按字、按行等等)。Java類庫的設計者通過設計大量的類來攻克這些難題,這些類就位於java.io包中。

什么是

Java IO中,流是一個核心的概念。流從概念上來說是一個連續的數據流。你既可以從流中讀取數據,也可以往流中寫數據。流與數據源或者數據流向的媒介相關聯。在Java IO中流既可以是字節流(以字節為單位進行讀寫),也可以是字符流(以字符為單位進行讀寫)

二、Java IO類庫的框架

2.1 Java IO的類型

雖然java IO類庫龐大,但總體來說其框架還是很清楚的。從是讀媒介還是寫媒介的維度看,Java IO可以分為:

1. 輸入流:InputStream和Reader

2. 輸出流:OutputStream和Writer

而從其處理流的類型的維度上看,Java IO又可以分為:

1. 字節流:InputStream和OutputStream

2. 字符流:Reader和Writer

 

01File

   創建文件   刪除文件 修改文件 刪除文件信息

02:字節流    InputStream            OutputStream     基類(父類)

03:字符流    Reader                Writer

04:緩沖流    BufferReader           BufferWriter  依賴於 Reader  Writer  

05:二進制流  DataInputStream        DataOutputStream 依賴於InputStream OutputStream

06:序例化    objectInputStream      ObjectOutputStream 依賴於InputStream OutputStream

 

 

我們的程序需要通過InputStream或Reader從數據源讀取數據,然后用OutputStream或者Writer將數據寫入到目標媒介中。其中,InputStream和Reader與數據源相關聯,OutputStream和writer與目標媒介相關聯。 以下的圖說明了這一點:

 

 

三、Java IO的基本用法

3.1 Java IO :字節流字節流對應的類應該是InputStreamOutputStream

1,用字節流寫文件

package com.dzq;
import java.io.*;
/**
 * 字節流    InputStream            OutputStream
 */
public class ByteDemo {
    public static void main(String[] args) {
        //創建輸入流和輸出流對象
        InputStream inputStream=null;
        OutputStream outputStream=null;
        try {
            inputStream=new FileInputStream("e:/aaa.txt");
            //true代表是否向文件拼接,不能刪除之前的內容
            outputStream=new FileOutputStream("e:/aaa.txt",true);
           //向文件寫入內容
            outputStream.write("54321".getBytes());
            //read方法0-255,如果流讀到了最后,將返回-1
            int num=0;//int -1   字符串 null
            while ((num=inputStream.read())!=-1){
                System.out.println((char)num);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            inputStream.close();
            outputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

 

3.2 Java IO :字符流字符流對應的類應該是ReaderWriter

3,用字符流文件

package com.dzq;
import java.io.*;
/*
 * 字符流    Reader                Writer
 */
public class CharDemo{
    public static void main(String[] args) {
        //創建字符流輸出和輸入
        Reader reader=null;
        Writer writer=null;
        try {
            reader=new FileReader("e:/aaa.txt");
            writer=new FileWriter("e:/aaa.txt",true);
            writer.write("我愛我家!");
            writer.write("我愛我家?");
            writer.write("我愛我家!!");
            writer.write("我愛我家??");
            writer.flush();
            writer.write("我愛我家!!!!");
            writer.close();
            //讀取
            //創建一次性讀取多個字符
            char[] bytes =new char[1024];
            int num=0;
            StringBuffer stringBuffer=new StringBuffer();
            while((num=reader.read(bytes))!=-1){
                stringBuffer.append(bytes);
            }
            System.out.println(bytes);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                writer.close();
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        }
}

 

3.3 Java IO  :二進制流( DataInputStream DataOutputStream 依賴於 InputStream    OutputStream

package com.dzq;
import java.io.*;
/*
 *二進制流  DataInputStream        DataOutputStream
 */
public class DataDemo {
   public static void main(String[] args) {
       //創建輸入流和輸出流對象
        InputStream inputStream=null;
        OutputStream outputStream=null;
        DataInputStream dataInputStream=null;
        DataOutputStream dataOutputStream=null;
        try {
            //獲取輸入流
            inputStream=new FileInputStream("e:/aaa.txt");
            dataInputStream=new DataInputStream(inputStream);//封裝
            //獲取輸出流
            outputStream=new FileOutputStream("e:/aaa.txt");
            dataOutputStream=new DataOutputStream(outputStream);
            //讀取
            int num=0;
            while ((num=dataInputStream.read())!=-1){
                dataOutputStream.write(num);//復制
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                dataOutputStream.close();
                dataInputStream.close();
                outputStream.close();
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 

3.4 Java IO(緩沖流BufferReader  BufferWriter 依賴於Reader Writer)

package com.dzq;
import java.io.*;
/**
 *緩沖流    BufferReader           BufferWriter
 */
public class BufferDemo {
    public static void main(String[] args) {
        //創建字符流輸出和輸入
        Reader reader = null;
        Writer writer = null;
        BufferedReader bufferReader=null;
        BufferedWriter bufferedWriter=null;
        try {
            //寫入
            writer=new FileWriter("e:/aaa.txt") ;
           bufferedWriter=new BufferedWriter(writer);//封裝
            bufferedWriter.write("我愛我家1");
            bufferedWriter.write("我愛我家2");
            bufferedWriter.write("我愛我家3");
            bufferedWriter.newLine();//換行
            bufferedWriter.write("我愛我家4");
            reader.close();
            bufferedWriter.close();//如果不關閉后兩行出不來
            //讀取
            reader=new FileReader("e:/aaa.txt") ;
            bufferReader=new BufferedReader(reader);//封裝
            //拼接
            String line=null;
            StringBuffer stringBuffer=new StringBuffer();
            while((line=bufferReader.readLine())!=null){
                stringBuffer.append(line);
            }
            System.out.println(stringBuffer.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                bufferReader.close();
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    }

 

3.5 Java IO序列化和非序列化

User類:

package com.cd;
import java.io.Serializable;
public class User implements Serializable{
    public String username;
    public String password;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }
    public User(){
    }
}

 

各方法:

package com.cd;
/**
 * 序列化和非序列化
 */
import java.io.*;
import java.util.Scanner;
public  class ObjectDemo {
   static Scanner input=new Scanner(System.in);
    //創建輸出流和輸入流
    static  InputStream inputStream=null;
    static  OutputStream outputStream=null;
    static ObjectInputStream objectInputStream=null;
    static ObjectOutputStream objectOutputStream=null;
    public static void main(String[] args) {
           //登錄
          Login();
          //注冊
          register();
    }
    //注冊
    private static void register() {
        User user =new User();
        System.out.println("請輸入你的用戶名");
        user.setUsername(input.next());
        System.out.println("請輸入你的密碼");
        user.setPassword(input.next());
        try {
         outputStream=new FileOutputStream("e:/aaa.txt");
           objectOutputStream=new ObjectOutputStream(outputStream);
            //把對象輸出到文件中
            objectOutputStream.writeObject(user);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                objectOutputStream.close();
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    //登錄
    private static void Login() {
        try {
            inputStream=new FileInputStream("e:/user.txt");
            objectInputStream=new ObjectInputStream(inputStream);
            //讀取對象
            User user= (User) objectInputStream.readObject();
            System.out.println(user);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                objectInputStream.close();
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 

3.6 Java IO :字節流轉換為字符流InputStreamReader

public static void convertByteToChar() throws IOException{
 File file= new File( "d:/test.txt"); 
//獲得一個字節流 InputStream is= new FileInputStream( file);
 //把字節流轉換為字符流,其實就是把字符流和字節流組合的結果。
 Reader reader= new InputStreamReader( is);
 char [] byteArray= new char[( int) file.length()]; 
int size= reader.read( byteArray); 
System. out.println( "大小:"+size +";內容:" +new String(byteArray));
 is.close(); 
reader.close();
 }

 

3.7 File 操作文件

DEMO:

public class FileDemo
{
    static  Scanner input =new Scanner(System.in);
    public static void main( String[] args )
    {
        System.out.println( "***********歡迎進入文件操作系統*******************" );
        System.out.println(" *******************1:創建文件*******************" );
        System.out.println( "*******************2:刪除文件*******************" );
        System.out.println( "*******************3:修改文件*******************" );
        System.out.println( "*******************4:創建文件夾*******************" );
        System.out.println( "*******************5:刪除文件夾*******************" );
        System.out.println( "*******************6:查詢文件夾下所有的列表*******************" );
        int choose =input.nextInt();
        switch(choose){
            case 1://創建文件
                createNewFile();
                break;
            case 2://刪除文件
                deleteNewFile();
                break;
            case 3://修改文件
                updateNewFile();
                break;
            case 4://創建文件夾
                mkdirs();
                break;
            case 5://刪除文件夾
                deletemkdirs();
                break;
            case 6://查詢文件夾下所有的列表
                findFileList();
                break;
        }
    }
 

 

創建文件

private static void createNewFile()
{
    System.out.println("請輸入文件的名稱:(默認為E:/)");
    String fileName=input.next();
    //創建文件
    File file=new File("E:/"+fileName);//默認的路徑
    if(file.exists()){
        System.out.println("該文件已存在!");
    }else{
        try {
            boolean flag =file.createNewFile();
            if(flag){
                System.out.println("文件夾創建成功");
            }else{
                System.out.println("文件夾創建失敗");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
 

 

刪除文件

private static void deleteNewFile()
{
    System.out.println("請輸入你要刪除的文件名稱:(默認為E:/)");
    String fileName=input.next();
    //創建File對象
    File file =new File("E:/"+fileName);
    if (file.exists()){
        boolean flag =file.delete();
        if(flag)
        {
            System.out.println("刪除成功");
        }else{
            System.out.println("刪除失敗");
        }
    }else{
        System.out.println("該文件不存在");
    }
}

 

修改文件

private static void updateNewFile()
{
    System.out.println("請你輸入需要修改的文件的名稱:(默認為E:/)");
    String oldFileName=input.next();
    System.out.println("請你輸入文件的新名稱:(默認為E:/)");
    String newFileName=input.next();
    //創建File對象
    File oldFile=new File("E:/"+oldFileName);
    File NewFile=new File("E:/"+newFileName);
    if(oldFile.renameTo(NewFile)){
        System.out.println("修改成功");
    }else{
        System.out.println("修改失敗");
    }
}

 

創建文件夾

private static void mkdirs() {
    System.out.println("請輸入你要創建的文件名稱:(默認為E:/)");
    String fileName=input.next();
    //創建File對象
    File file =new File("E:/"+fileName);
    if (file.mkdirs()){
            System.out.println("創建成功");
        }else{
            System.out.println("創建失敗");
        }
}

 

 

刪除文件夾

一:刪除文件夾的方法先刪除文件夾里面的東西在刪除文件

public static void delFolder(String folderPath) {
    try {
        delAllFile(folderPath); //刪除完里面所有內容
        String filePath = folderPath;
        filePath = filePath.toString();
        java.io.File myFilePath = new java.io.File(filePath);
        myFilePath.delete(); //刪除空文件夾
    } catch (Exception e) {
        e.printStackTrace();
    }
}

 

二:刪除文件夾的方法

 

public static boolean delAllFile(String path) {
    boolean flag = false;
    File file = new File(path);
    if (!file.exists()) {
        return flag;
    }
    if (!file.isDirectory()) {
        return flag;
    }
    String[] tempList = file.list();
    File temp = null;
    for (int i = 0; i < tempList.length; i++) {
        if (path.endsWith(File.separator)) {
            temp = new File(path + tempList[i]);
        } else {
            temp = new File(path + File.separator + tempList[i]);
        }
        if (temp.isFile()) {
            temp.delete();
        }
        if (temp.isDirectory()) {
            delAllFile(path  + tempList[i]);//先刪除文件夾里面的文件
            delFolder(path  + tempList[i]);//再刪除空文件夾
            flag = true;
        }
    }
    return flag;
}

 

 

 

三:刪除文件夾的終極方法

private static void deletemkdirs() {
    System.out.println("請輸入你要刪除的文件夾名稱:(默認為E:/)");
    String fileName=input.next();
    //創建File對象
    File file =new File("E:/"+fileName);
    if (file.exists()){
        boolean flag = delAllFile("E:/qqq");
        if(flag)
        {
            System.out.println("刪除失敗");
        }else{
            file.delete();
            System.out.println(" 刪除成功");
        }
    }else{
        System.out.println("該文件不存在");
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM