Java IO流-字符流
2017-11-05 18:34:39
Java中的IO流按數據類型分類分為兩種,一是字節流,二是字符流。字符流的出現是為了簡化文本數據的讀入和寫出操作。
如果操作的文件是文本文件,那麽使用字符流會大大簡化操作,但是如果什麽都不知道,就用字節流。
- 字符流
由於字節流中讀取中文不是很方便,所以Java中提供了轉換流,所以
字符流 = 字節流 + 編碼表(By the way,‘a’=97,‘A’=65,‘0’=48)。
字符流也有兩個抽象基類:Writer
Reader
* OutputStreamWriter
OutputStreamWriter 是字符流通向字節流的橋梁:可使用指定的
將要寫入流中的字符編碼成字節。它使用的字符集可以由名稱指定或顯式給定,否則將接受平臺默認的字符集。charset
每次調用 write() 方法都會導致在給定字符(或字符集)上調用編碼轉換器。在寫入底層輸出流之前,得到的這些字節將在緩沖區中累積。可以指定此緩沖區的大小,不過,默認的緩沖區對多數用途來說已足夠大。註意,傳遞給 write() 方法的字符沒有緩沖。
為了獲得最高效率,可考慮將 OutputStreamWriter 包裝到 BufferedWriter 中,以避免頻繁調用轉換器。
**構造方法
**常用方法
在寫入String時不指定偏移,則寫入lenth的長度。
import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; public class Demo1 { public static void main(String[] args) throws IOException { OutputStreamWriter fout = new OutputStreamWriter(new FileOutputStream("" + "E:\\text.txt","GBK")); fout.write("你好,Java");
fout.flush(); fout.close(); } }
註意這裏的默認編碼是GBK。正如上文所言,在最後輸出前,會在緩沖區進行編碼,所以需要調用flush清空緩沖區,將文件輸出。但是close()前會自動刷新。
* InputSteamReader
InputStreamReader 是字節流通向字符流的橋梁:它使用指定的
讀取字節並將其解碼為字符。它使用的字符集可以由名稱指定或顯式給定,或者可以接受平臺默認的字符集。charset
每次調用 InputStreamReader 中的一個 read() 方法都會導致從底層輸入流讀取一個或多個字節。要啟用從字節到字符的有效轉換,可以提前從底層流讀取更多的字節,使其超過滿足當前讀取操作所需的字節。
為了達到最高效率,可要考慮在 BufferedReader 內包裝 InputStreamReader。
**構造方法
**常用方法
為了簡化OutputStreamWriter和InputStreamReader的初始化工作,這兩個類又提供了兩個子類作為便捷類。即:
FileWriter類,初始化方法FileWriter(File file,bool append),註意FileWriter類雖然簡化了構建,但是無法設置編碼方式,需要使用父類OutputStreamWriter
FileReader類,初始化方法FileReader(File file),同樣如果要設定解碼方式,需要使用父類InputStreamReader
==>同樣的,字符流為了高效讀寫也提供了
字符緩沖流:BufferedWriter,BufferedReader。
* BufferedWriter
BufferedWriter將文本寫入字符輸出流,緩沖各個字符,從而提供單個字符、數組和字符串的高效寫入。
可以指定緩沖區的大小,或者接受默認的大小。在大多數情況下,默認值就足夠大了。
**構造方法
**常用方法
import java.io.*; public class Demo1 { public static void main(String[] args) throws IOException { BufferedWriter fout = new BufferedWriter(new FileWriter( "E:\\text.txt")); fout.write("你好,Java"); fout.close(); } }
* BufferedReader
BufferedReader從字符輸入流中讀取文本,緩沖各個字符,從而實現字符、數組和行的高效讀取。
可以指定緩沖區的大小,或者可使用默認的大小。大多數情況下,默認值就足夠大了。
*構造方法
**常用方法
readline()終於出來了~ 如果已到達流末尾,則返回 null。
@Test public void demo() throws IOException { BufferedReader bufferedReader = new BufferedReader(new FileReader( "E:\\text.txt")); int ch; while((ch = bufferedReader.read())!=-1) { System.out.print((char)ch); } bufferedReader.close(); }
==>一種特殊的輸出流,打印流PrintWriter。
PrintWriter:向文本輸出流打印對象的格式化表示形式。此類實現在 PrintStream
中的所有 print 方法。它不包含用於寫入原始字節的方法,對於這些字節,程序應該使用未編碼的字節流進行寫入。
與 PrintStream
類不同,如果啟用了自動刷新,則只有在調用 println、printf 或 format 的其中一個方法時才可能完成此操作,而不是每當正好輸出換行符時才完成。這些方法使用平臺自有的行分隔符概念,而不是換行符。
PrintWriter打印流的特點:
A:只有寫數據的,沒有讀數據的。
B:可以操作任意類型的數據
C:可以指定是否自動刷新
D:可以直接使用路徑進行初始化
**構造方法
**常用方法
Java IO流-字符流