Java IO學習筆記三

  • 在整個IO包中,實際上就是分為字節流和字符流,但是除了這兩個流之外,還存在了一組字節流-字符流的轉換類。

  • OutputStreamWriter:是Writer的子類,將輸出的字符流變為字節流,即:將一個字符流的輸出對象變成字節流的輸出對象。

  • InputStreamReader:是Reader的子類,將輸入的字節流變為字符流,即:將一個字節流的輸入對象變成字符流的輸入對象。

  • 一般在操作輸入輸出內容就需要使用字節或字符流,但是有些時候需要將字符流變成字節流的形式,或者將字節流變為字符流的形式,所以,就需要另外一組轉換流的操作類。

InputStreamReader

  • InputStreamReader 是字節流通向字符流的橋樑:它使用指定的 charset 讀取字節並將其解碼為字符。它使用的字符集可以由名稱指定或顯式給定,或者可以接受平台默認的字符集。

  • 每次調用 InputStreamReader 中的一個 read() 方法都會導致從底層輸入流讀取一個或多個字節。要啟用從字節到字符的有效轉換,可以提前從底層流讀取更多的字節,使其超過滿足當前讀取操作所需的字節。

  • 主要的功能還是從文件中讀取內容,不過是一次性的讀取多個字節,這個很像它的子類FileReader

構造函數

  • InputStreamReader(InputStream in) 創建一個使用默認字符集的 InputStreamReader,不過這裏的InputStream是抽下類,因此可以使用它的子類FileInputStream實例化,這裏的FileInputStream是操作字節流的,顯然看出這個類的作用就是字符流和字節流的橋樑

常用方法

  • close()
  • int read() 讀取單個字符
  • int read(Char[] c) 讀取字符存儲在字符數組中
  • int read(char[] cbuf, int offset, int length) 將字符讀入數組中的某一部分
  • boolean ready() 判斷此流是否已經準備好用於讀取。

實例

package IO;

import java.io.*;

/**
 * Created by chenjiabing on 17-5-24.
 */
public class demo4 {
    public static void main(String args[]) {
        File file = new File("/tmp" + File.separator + "test" + File.separator + "test.txt");
        InputStreamReader inputStreamReader = null;
        try {
            inputStreamReader = new InputStreamReader(new FileInputStream(file));  //初始化
            char[] c = new char[(int) file.length()];   //創建數組
            try {
                int len = inputStreamReader.read(c);   //將內容讀取到數組中
                System.out.println(len);
                for (int i = 0; i < c.length; i++) {
                    System.out.print(c[i]);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }


        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }finally {
            if(inputStreamReader!=null)
            {
                try {
                    inputStreamReader.close();   //關閉
                }catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }

    }
}

注意:從上面的代碼中可以看到這個和FileReader的操作是一樣的,只是構造的方法不一樣

OutputStreamWriter

  • OutputStreamWriter 是字符流通向字節流的橋樑:可使用指定的 charset 將要寫入流中的字符編碼成字節。它使用的字符集可以由名稱指定或顯式給定,否則將接受平台默認的字符集。

  • 每次調用 write() 方法都會導致在給定字符(或字符集)上調用編碼轉換器。在寫入底層輸出流之前,得到的這些字節將在緩衝區中累積。可以指定此緩衝區的大小,不過,默認的緩衝區對多數用途來說已足夠大。注意,傳遞給 write() 方法的字符沒有緩衝。

  • 主要的功能還是向文件中寫入文件

構造函數

  • OutputStreamWriter(OutputStream out) 創建使用默認字符編碼的 OutputStreamWriter。這裏同樣是抽象類,所以用它的子類FileOutputStream實例化

常用方法

  • close()
  • flush()
  • write(String str) 寫入字符串
  • void write(String str, int off, int len) 寫入字符串的某一部分。
  • write(int c) 寫入單個字符
  • void write(char[] cbuf, int off, int len) 寫入字符數組的某一部分。

實例

package IO;

import java.io.*;

/**
 * Created by chenjiabing on 17-5-24.
 */
public class demo5 {
    public static void main(String[] args)
    {
        File file=new File("/tmp"+File.separator+"test"+File.separator+"test.txt");
        OutputStreamWriter outputStreamWriter=null;
        try {
            outputStreamWriter=new OutputStreamWriter(new FileOutputStream(file,true));
            String str="陳加兵\n";
            int data=48;
            String name="chenjiabing";
            try {
                outputStreamWriter.write(str);
                outputStreamWriter.write(data);
                outputStreamWriter.write(name,0,2);   //寫入字符串的一部分
            }catch (IOException e)
            {
                e.printStackTrace();
            }
        }catch (FileNotFoundException e)
        {
            e.printStackTrace();
        }finally {
            if(outputStreamWriter!=null)
            {
                try {
                    outputStreamWriter.flush();
                    outputStreamWriter.close();
                }catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }
}

從上面可以看出OutputStreamWriterFileWriter的用法一樣

參考文章

  • http://www.cnblogs.com/lich/archive/2011/12/11/2283848.html
分享