1.轉換流:把字節流轉成字符流
InputStreamReader:把字節輸入流轉成字符輸入流.OutputStreamWriter:把字節輸出流轉成字符輸出流.
---------------------------------------------------------
爲什麼有字節轉字符流,沒有字符轉字節流.
字節流可以操作一切文件(純文本文件/二進制文件).
字符流是用來操作中文純文本使用的,本身是對字節流的增強.
InputStreamReader 是字節流通向字符流的橋樑:它使用指定的
charset
讀取字節並將其解碼爲字符。它使用的字符集可以由名稱指定或顯式給定,或者可以接受平臺默認的字符集。
每次調用 InputStreamReader 中的一個 read() 方法都會導致從底層輸入流讀取一個或多個字節。要啓用從字節到字符的有效轉換,可以提前從底層流讀取更多的字節,使其超過滿足當前讀取操作所需的字節。
爲了達到最高效率,可要考慮在 BufferedReader 內包裝 InputStreamReader。例如:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
OutputStreamWriter 是字節流通向字符流的橋樑:它使用指定的 charset
讀取字節並將其解碼爲字符。它使用的字符集可以由名稱指定或顯式給定,或者可以接受平臺默認的字符集。
每次調用 write() 方法都會導致在給定字符(或字符集)上調用編碼轉換器。在寫入底層輸出流之前,得到的這些字節將在緩衝區中累積。可以指定此緩衝區的大小,不過,默認的緩衝區對多數用途來說已足夠大。注意,傳遞給 write() 方法的字符沒有緩衝。
爲了獲得最高效率,可考慮將 OutputStreamWriter 包裝到 BufferedWriter 中,以避免頻繁調用轉換器。例如:
Writer out = new BufferedWriter(new OutputStreamWriter(System.out));
文件拷貝例子:這裏傳入的是字節流,然後我們把字節流使用上面的轉換流包裝裝換爲字符流,然後再用緩衝流再包裝,這樣讀寫最高效了:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class IODemo6 {
public static void main(String[] args) {
//這裏我使用了JDK1.7新特性:自動關閉資源,將資源的創建放到try語句的()中,資源使用完畢之後會自動關閉,不用我們手動釋放
try
(
//創建源
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("file.txt")));
//創建目標
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("fileCopy.txt")));
)
{
//裝換再加上使用緩衝流包裝,接下來的操作就是字符流的操作了
String len = null;
while ((len=reader.readLine())!=null) {
writer.write(len);
writer.newLine();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}