天天看點

java的IO流詳解4.字元流5.高效流效率比對

1.基本概念

IO:Java對資料的操作是通過流的方式,IO流用來處理裝置之間的資料傳輸,上傳檔案和下載下傳檔案,Java用于操作流的對象都在IO包中。

2.IO流的分類

圖示:(主要IO流) 

java的IO流詳解4.字元流5.高效流效率比對

3.位元組流

(1).位元組流基類

1).InputStream

InputStream:位元組輸入流基類,抽象類是表示位元組輸入流的所有類的超類。

常用方法:

    // 從輸入流中讀取資料的下一個位元組
    abstract int read()
    // 從輸入流中讀取一定數量的位元組,并将其存儲在緩沖區數組 b中
    int read(byte[] b)
    // 将輸入流中最多 len 個資料位元組讀入 byte 數組
    int read(byte[] b, int off, int len)


    // 跳過和丢棄此輸入流中資料的 n個位元組
    long skip(long n)

    // 關閉此輸入流并釋放與該流關聯的所有系統資源
    void close()
           

2).OutputStream

OutputStream:位元組輸出流基類,抽象類是表示輸出位元組流的所有類的超類。

常用方法:
    // 将 b.length 個位元組從指定的 byte 數組寫入此輸出流
    void write(byte[] b)
    // 将指定 byte 數組中從偏移量 off 開始的 len 個位元組寫入此輸出流
    void write(byte[] b, int off, int len)
    // 将指定的位元組寫入此輸出流
    abstract void write(int b)

    // 關閉此輸出流并釋放與此流有關的所有系統資源
    void close()

    // 重新整理此輸出流并強制寫出所有緩沖的輸出位元組
    void flush()
           

(2).位元組檔案操作流

1).FileInputStream

FileInputStream:位元組檔案輸入流,從檔案系統中的某個檔案中獲得輸入位元組,用于讀取諸如圖像資料之類的原始位元組流。

構造方法:
    // 通過打開一個到實際檔案的連接配接來建立一個FileInputStream,該檔案通過檔案系統中的File對象file指定
    FileInputStream(File file)
    // 通過打開一個到實際檔案的連接配接來建立一個FileInputStream,該檔案通過檔案系統中的路徑name指定
    FileInputStream(String name)

 常用方法:覆寫和重寫了父類的的常用方法。
           
// 讀取f盤下該檔案f://hell/test.txt
        //構造方法1
        InputStream inputStream = new FileInputStream(new File("f://hello//test.txt"));
        int i = 0;
        //一次讀取一個位元組
        while ((i = inputStream.read()) != -1) {

            // System.out.print(i + " ");// 65 66 67 68
            //為什麼會輸出65 66 67 68?因為字元在底層存儲的時候就是存儲的數值。即字元對應的ASCII碼。
            System.out.print((char) i + " ");// A B C D
        }
        //關閉IO流
        inputStream.close();
           
// 讀取f盤下該檔案f://hell/test.txt
        //構造方法2
        InputStream inputStream2 = new FileInputStream("f://hello/test.txt");
        // 位元組數組
        byte[] b = new byte[2];
        int i2 = 0;
        //  一次讀取一個位元組數組
        while ((i2 = inputStream2.read(b)) != -1) {

            System.out.print(new String(b, 0, i2) + " ");// AB CD
        }
        //關閉IO流
        inputStream2.close();
           
注: 一次讀取一個位元組數組,提高了操作效率,IO流使用完畢一定要關閉。

2).FileOutputStream

FileOutputStream:位元組檔案輸出流是用于将資料寫入到File,從程式中寫入到其他位置。

構造方法:
    // 建立一個向指定File對象表示的檔案中寫入資料的檔案輸出流
    FileOutputStream(File file)
    // 建立一個向指定File對象表示的檔案中寫入資料的檔案輸出流
    FileOutputStream(File file, boolean append)
    // 建立一個向具有指定名稱的檔案中寫入資料的輸出檔案流
    FileOutputStream(String name)
    // 建立一個向具有指定name的檔案中寫入資料的輸出檔案流
    FileOutputStream(String name, boolean append)

 常用方法:覆寫和重寫了父類的的常用方法。
           
OutputStream outputStream = new FileOutputStream(new File("test.txt"));
        // 寫出資料
        outputStream.write("ABCD".getBytes());
        // 關閉IO流
        outputStream.close();

        // 内容追加寫入
        OutputStream outputStream2 = new FileOutputStream("test.txt", true);
        // 輸出換行符
        outputStream2.write("\r\n".getBytes());
        // 輸出追加内容
        outputStream2.write("hello".getBytes());
        // 關閉IO流
        outputStream2.close();
           
注;輸出的目的地檔案不存在,則會自動建立,不指定盤符的話,預設建立在項目目錄下;輸出換行符時一定要寫\r\n不能隻寫\n,因為不同文本編輯器對換行符的識别存在差異性。

(3).位元組緩沖流(高效流)

1).BufferedInputStream

BufferedInputStream:位元組緩沖輸入流,提高了讀取效率。

構造方法:
     // 建立一個 BufferedInputStream并儲存其參數,即輸入流in,以便将來使用。
     BufferedInputStream(InputStream in)
     // 建立具有指定緩沖區大小的 BufferedInputStream并儲存其參數,即輸入流in以便将來使用
     BufferedInputStream(InputStream in, int size)
           
InputStream in = new FileInputStream("test.txt");
        // 位元組緩存流
        BufferedInputStream bis = new BufferedInputStream(in);
        byte[] bs = new byte[20];
        int len = 0;
        while ((len = bis.read(bs)) != -1) {

            System.out.print(new String(bs, 0, len));
            // ABCD
            // hello
        }
        // 關閉流
        bis.close();
           

2).BufferedOutputStream

BufferedOutputStream:位元組緩沖輸出流,提高了寫出效率。

構造方法:
     // 建立一個新的緩沖輸出流,以将資料寫入指定的底層輸出流
     BufferedOutputStream(OutputStream out)
     // 建立一個新的緩沖輸出流,以将具有指定緩沖區大小的資料寫入指定的底層輸出流
     BufferedOutputStream(OutputStream out, int size)

     常用方法:
     // 将指定 byte 數組中從偏移量 off 開始的 len 個位元組寫入此緩沖的輸出流
     void write(byte[] b, int off, int len)
     // 将指定的位元組寫入此緩沖的輸出流
     void write(int b)
     // 重新整理此緩沖的輸出流
     void flush()
           
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("test.txt", true));
        // 輸出換行符
        bos.write("\r\n".getBytes());
        // 輸出内容
        bos.write("Hello Android".getBytes());
        // 重新整理此緩沖的輸出流
        bos.flush();
        // 關閉流
        bos.close();
           

4.字元流

(1).字元流基類

1).Reader

Reader:讀取字元流的抽象類.

常用方法:
    // 讀取單個字元
    int read()
    // 将字元讀入數組
    int read(char[] cbuf)
    // 将字元讀入數組的某一部分
    abstract int read(char[] cbuf, int off, int len)
    // 跳過字元
    long skip(long n)

    // 關閉該流并釋放與之關聯的所有資源
    abstract void close()
           

2).Writer

Writer:寫入字元流的抽象類.

常用方法:
    // 寫入字元數組
     void write(char[] cbuf)
    // 寫入字元數組的某一部分
    abstract void write(char[] cbuf, int off, int len)
    // 寫入單個字元
    void write(int c)
    // 寫入字元串
    void write(String str)
    // 寫入字元串的某一部分
    void write(String str, int off, int len)

    // 将指定字元添加到此 writer
    Writer append(char c)
    // 将指定字元序列添加到此 writer
    Writer append(CharSequence csq)
    // 将指定字元序列的子序列添加到此 writer.Appendable
    Writer append(CharSequence csq, int start, int end)

    // 關閉此流,但要先重新整理它
    abstract void close()
    // 重新整理該流的緩沖
    abstract void flush()
           

(2).字元轉換流

1).InputStreamReader

InputStreamReader:位元組流轉字元流,它使用的字元集可以由名稱指定或顯式給定,否則将接受平台預設的字元集。

構造方法:
    // 建立一個使用預設字元集的 InputStreamReader
    InputStreamReader(InputStream in)
    // 建立使用給定字元集的 InputStreamReader
    InputStreamReader(InputStream in, Charset cs)
    // 建立使用給定字元集解碼器的 InputStreamReader
    InputStreamReader(InputStream in, CharsetDecoder dec)
    // 建立使用指定字元集的 InputStreamReader
    InputStreamReader(InputStream in, String charsetName)
 特有方法:
    //傳回此流使用的字元編碼的名稱 
    String getEncoding() 
           
//使用預設編碼        
        InputStreamReader reader = new InputStreamReader(new FileInputStream("test.txt"));
        int len;
        while ((len = reader.read()) != -1) {
            System.out.print((char) len);//愛生活,愛Android

        }
        reader.close();

         //指定編碼 
        InputStreamReader reader = new InputStreamReader(new FileInputStream("test.txt"),"utf-8");
        int len;
        while ((len = reader.read()) != -1) {
            System.out.print((char) len);//????????Android
        }
        reader.close();
           
注:Eclipse預設使用GBK編碼,test.txt檔案是以是GBK編碼,當指定utf-8編碼時是以會亂碼。

2).OutputStreamWriter

OutputStreamWriter:位元組流轉字元流。

構造方法:
    // 建立使用預設字元編碼的 OutputStreamWriter
    OutputStreamWriter(OutputStream out)
    // 建立使用給定字元集的 OutputStreamWriter
    OutputStreamWriter(OutputStream out, Charset cs)
    // 建立使用給定字元集編碼器的 OutputStreamWriter
    OutputStreamWriter(OutputStream out, CharsetEncoder enc)
    // 建立使用指定字元集的 OutputStreamWriter
    OutputStreamWriter(OutputStream out, String charsetName)
 特有方法:
    //傳回此流使用的字元編碼的名稱 
    String getEncoding() 
           

(3).字元緩沖流(高效流)

1).BufferedReader

BufferedReader:字元緩沖流,從字元輸入流中讀取文本,緩沖各個字元,進而實作字元、數組和行的高效讀取。

構造方法:
    // 建立一個使用預設大小輸入緩沖區的緩沖字元輸入流
    BufferedReader(Reader in)
    // 建立一個使用指定大小輸入緩沖區的緩沖字元輸入流
    BufferedReader(Reader in, int sz)
 特有方法:
    // 讀取一個文本行
    String readLine()
           
//生成字元緩沖流對象
        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("test.txt")));
        String str;
        //一次性讀取一行
        while ((str = reader.readLine()) != null) {
            System.out.println(str);// 愛生活,愛Android
        }

        //關閉流
        reader.close();
           

2).BufferedWriter

BufferedWriter:字元緩沖流,将文本寫入字元輸出流,緩沖各個字元,進而提供單個字元、數組和字元串的高效寫入。

構造方法:
    // 建立一個使用預設大小輸出緩沖區的緩沖字元輸出流
    BufferedWriter(Writer out)
    // 建立一個使用給定大小輸出緩沖區的新緩沖字元輸出流
    BufferedWriter(Writer out, int sz)
 特有方法:
    // 寫入一個行分隔符
    void newLine() 
           

(4).FileReader、FileWriter

FileReader:InputStreamReader類的直接子類,用來讀取字元檔案的便捷類,使用預設字元編碼。
 FileWriter:OutputStreamWriter類的直接子類,用來寫入字元檔案的便捷類,使用預設字元編碼。
           

5.高效流效率比對

讀取f盤下的一個視訊檔案到項目中:檔案大小29.5 MB
           

讀取方式一:

FileInputStream inputStream = new FileInputStream("f://滑闆//HEEL_FLIP.mp4");
        FileOutputStream outputStream = new FileOutputStream("HEEL_FLIP.mp4");
        int len;
        // 開始時間
        long begin = System.currentTimeMillis();
        // 一次讀取一個位元組
        while ((len = inputStream.read()) != -1) {
            outputStream.write(len);
        }
        // 用時毫秒
        System.out.println(System.currentTimeMillis() - begin);// 213195
        //關閉流釋放資源
        inputStream.close();
        outputStream.close();
           

讀取方式二:

FileInputStream inputStream = new FileInputStream("f://滑闆//HEEL_FLIP.mp4");
        FileOutputStream outputStream = new FileOutputStream("HEEL_FLIP.mp4");
        int len;
        byte[] bs = new byte[1024];
        // 開始時間
        long begin = System.currentTimeMillis();
        // 一次讀取一個位元組數組
        while ((len = inputStream.read(bs)) != -1) {
            outputStream.write(bs, 0, len);
        }
        // 用時毫秒
        System.out.println(System.currentTimeMillis() - begin);// 281

        inputStream.close();
        outputStream.close();
           

讀取方式三:

FileInputStream inputStream = new FileInputStream("f://滑闆//HEEL_FLIP.mp4");
        BufferedInputStream bis = new BufferedInputStream(inputStream);
        FileOutputStream outputStream = new FileOutputStream("HEEL_FLIP.mp4");
        BufferedOutputStream bos = new BufferedOutputStream(outputStream);
        int len;
        byte[] bs = new byte[1024];
        // 開始時間
        long begin = System.currentTimeMillis();
        while ((len = bis.read(bs)) != -1) {
            bos.write(bs, 0, len);
        }
        // 用時毫秒
        System.out.println(System.currentTimeMillis() - begin);// 78

        bis.close();
        bos.close();
           
注:由此可以看出高效緩沖流讀寫速度是非常快的,建議使用。