重學java中的輸入輸出流

每天都要加油鴨!發表於2020-11-24

以前剛學java的時候也學過Java流的知識,但是都比較淺顯,最近工作中發現用的地方特別多,每次用的時候總是要卡一會兒,這才意思到自己學的不紮實,所以準備再系統學習總結下。

簡要說明:

Java所有的I/O機制都是基於資料流進行輸入輸出,這些資料流表示了字元或者位元組資料的流動序列。Java的I/O流提供了讀寫資料的標準方法。任何Java中表示資料來源的物件都會提供以資料流的方式讀寫它的資料的方法。
流是一組有順序的,有起點和終點的位元組集合,是對資料傳輸的總稱或抽象。即資料在兩裝置間的傳輸稱為流,流的本質是資料傳輸,根據資料傳輸特性將流抽象為各種類,方便更直觀的進行資料操作。

JDK所提供的所有流類位於java.io包中,都分別繼承自以下四種抽象流類:
InputStream:繼承自InputStream的流都是用於向程式中輸入資料的,且資料單位都是位元組(8位)。
OutputSteam:繼承自OutputStream的流都是程式用於向外輸出資料的,且資料單位都是位元組(8位)。
Reader:繼承自Reader的流都是用於向程式中輸入資料的,且資料單位都是字元(16位)。
Writer:繼承自Writer的流都是程式用於向外輸出資料的,且資料單位都是字元(16位)。

(這裡以前一直搞混InputStream和OutputSteam的概念,要這樣理解:向程式輸入為input,從程式向外部輸出則為output,Reader和Writer也是類似這樣的意思,即站在程式的角度分辨。)

Java流的分類

  • 按流向分:
    輸入流: 程式可以從中讀取資料的流。
    輸出流: 程式能向其中寫入資料的流。
  • 按資料傳輸單位分:
    位元組流: 以位元組為單位傳輸資料的流
    字元流: 以字元為單位傳輸資料的流
  • 按功能分:
    節點流: 用於直接操作目標裝置的流
    過濾流(處理流): 是對一個已存在的流的連結和封裝,通過對資料進行處理為程式提供功能強大、靈活的讀寫功能,是使用一個 已經存在的輸入流或者輸出流連結建立的。例如能實現緩衝的BufferedInputStream,實現基本資料型別的讀的DataInputStream。

這裡對節點流和處理流比較陌生,簡單記錄一下
節點流  相當於是可以直接操作目標資料的流,不用做任何封裝,列如直接讀取檔案的FileInputStream
對於InutStream來說有這麼多的子類。其中FilterInputStream(他的子類DataInputStream,BufferedInputStream…都是過濾流)是過濾流,其他都是節點流。
在這裡插入圖片描述
樣的FilterOutputStream(和他的子類DataOutStream,BuffereOutStream是過濾流)是過濾流。其他都是節點流、
在這裡插入圖片描述
在這裡插入圖片描述

程式碼示例:

public class StreamStudy {

    public static void main(String[] args) throws Exception {

        File file = new File("test"+File.separatorChar+"test.txt");
        if (!file.exists()){
            System.out.println("檔案不存在!");
        }

        //1、程式讀檔案
        FileInputStream fileInputStream = new FileInputStream(file);
        byte[] b = new byte[256];
        fileInputStream.read(b);
        System.out.println(new String(b,"utf-8"));
        fileInputStream.close();

        //2、程式寫檔案(覆蓋原來的資料,如果追加資料使用FileWriter  或  RandomAccessFile )
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        fileOutputStream.write("寫入資料".getBytes("utf-8"));
        //flush  這裡的flush是沒有效果的,FileOutputStream沒有對flush方法重寫,只用使用緩衝區的時候,
        //       這個flush才會生效,例如Bufferxxx..
        fileOutputStream.flush();
        fileOutputStream.close();


        //3.字元輸出流FileWriter 適用於文字型別的資料
        //引數append 為true 追加資料
        FileWriter fileWriter = new FileWriter(file,true);
        fileWriter.write("是小明");
        fileWriter.flush();
        fileWriter.close();

        //4.字元讀取流FileReader
        FileReader fileReader = new FileReader(file);
        char []c = new char[256];
        fileReader.read(c);
        fileReader.close();
        System.out.println(c);

        //5、位元組流  字元流相互轉化
        FileInputStream fileInputStream1 = new FileInputStream(file);
        InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream1, Charset.forName("utf-8"));
        char[] d = new char[128];
        inputStreamReader.read(d);
        inputStreamReader.close();
        fileInputStream.close();
        System.out.println(c);
        FileOutputStream fileOutputStream1 = new FileOutputStream(file);
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream1, "utf-8");
        outputStreamWriter.write("我是");
        outputStreamWriter.flush();
        outputStreamWriter.close();
        fileInputStream.close();

        //6、使用處理流封裝節點流  當然還有其他處理流,這裡拿DataOutputStream  DataInputStream舉例
        //DataOutputStream 可以寫入任何資料物件
        //寫資料
        FileOutputStream fileOutputStream2 = new FileOutputStream(file);
        DataOutputStream dataOutputStream = new DataOutputStream(fileOutputStream2);  //封裝節點流
        //處理流提供更豐富的方法
        dataOutputStream.writeChar(5);
        dataOutputStream.writeInt(5);
        dataOutputStream.writeUTF("Dasdasd");
        dataOutputStream.flush();
        dataOutputStream.close();
        //讀資料
        FileInputStream fileInputStream2 = new FileInputStream(file);
        DataInputStream dataInputStream = new DataInputStream(fileInputStream2);
        System.out.println(dataInputStream.readChar());
        System.out.println(dataInputStream.readInt());
        System.out.println(dataInputStream.readUTF());
    }

}

相關文章