字符流:
- Reader: 用于讀取字符流的抽象類痒谴。子類必須實現(xiàn)的方法只有 read(char[], int, int) 和 close()癣籽。
|---BufferedReader :從字符輸入流中讀取文本,緩沖各個字符法希,從而實現(xiàn)字符瑰煎、數(shù)組和行的高效讀取莉御。 可以指定緩沖區(qū)的大小,或者可使用默認的大小匙奴。大多數(shù)情況下堆巧,默認值就足夠大了。
|---LineNumberReader :跟蹤行號的緩沖字符輸入流泼菌。此類定義了方法 setLineNumber(int) 和getLineNumber()谍肤,它們可分別用于設(shè)置和獲取當前行號。
|---InputStreamReader :是字節(jié)流通向字符流的橋梁:它使用指定的 charset 讀取字節(jié)并將其解碼為字符哗伯。它使用的字符集可以由名稱指定或顯式給定荒揣,或者可以接受平臺默認的字符集。
|---FileReader: :用來讀取字符文件的便捷類焊刹。此類的構(gòu)造方法假定默認字符編碼和默認字節(jié)緩沖區(qū)大小
都是適當?shù)南等巍R约褐付ㄟ@些值,可以先在 FileInputStream 上構(gòu)造一個InputStreamReader虐块。
- |---CharArrayReade
- |---StringReader
- Writer: 寫入字符流的抽象類俩滥。子類必須實現(xiàn)的方法僅有 write(char[], int, int)、flush() 和 close()非凌。
- |---BufferedWriter: :將文本寫入字符輸出流举农,緩沖各個字符,從而提供單個字符敞嗡、數(shù)組和字符串的高效寫入颁糟。
- |---OutputStreamWriter :是字符流通向字節(jié)流的橋梁:可使用指定的 charset 將要寫入流中的字符編碼成字節(jié)。它使用的字符集可以由名稱指定或顯式給定喉悴,否則將接受平臺默認的字符集棱貌。
- |---FileWriter: :用來寫入字符文件的便捷類。此類的構(gòu)造方法假定默認字符編碼和默認字節(jié)緩沖區(qū)大小都是可接受的箕肃。要自己指定這些值婚脱,可以先在 FileOutputStream 上構(gòu)造一個 OutputStreamWriter。
- |---PrintWrite
- |---CharArrayWriter
- |---StringWriter
字 節(jié) 流:
- InputStream: 是表示字節(jié)輸入流的所有類的超類。
- |--- FileInputStream: :從文件系統(tǒng)中的某個文件中獲得輸入字節(jié)障贸。哪些文件可用取決于主機環(huán)境错森。FileInputStream 用于讀取諸如圖像數(shù)據(jù)之類的原始字節(jié)流。要讀取字符流篮洁,請考慮使用 FileReader涩维。
- |--- FilterInputStream: :包含其他一些輸入流,它將這些流用作其基本數(shù)據(jù)源袁波,它可以直接傳輸數(shù)據(jù)或提供一些額外的功能瓦阐。
- |--- BufferedInputStream :該類實現(xiàn)緩沖的輸入流。
- |--- Stream :
- |--- ObjectInputStream :
- |--- PipedInputStream
- OutputStream:此抽象類是表示輸出字節(jié)流的所有類的超類篷牌。
- |--- FileOutputStream :文件輸出流是用于將數(shù)據(jù)寫入 File 或 FileDescriptor 的輸出流睡蟋。
- |--- FilterOutputStream :此類是過濾輸出流的所有類的超類。
- |--- BufferedOutputStream :該類實現(xiàn)緩沖的輸出流枷颊。
- |--- PrintStream :
- |--- DataOutputStream :
- |--- ObjectOutputStream :
- |--- PipedOutputStream:
規(guī)律總結(jié)
IO流中的對象:其實很簡單戳杀,就是讀取和寫入。但是因為功能的不同偷卧,流的體系中提供 N 多的對象豺瘤。那么開始時,到
底該用哪個對象更為合適呢听诸?這就需要明確流的操作規(guī)律坐求。
1 ,明確源和目的晌梨。
- 數(shù)據(jù)源:就是需要讀取桥嗤,可以使用兩個體系:InputStream、Reader仔蝌;
- 數(shù)據(jù)匯:就是需要寫入泛领,可以使用兩個體系:OutputStream、Writer敛惊;
2 渊鞋,操作的數(shù)據(jù)是否是純文本數(shù)據(jù)?
- 如果是:數(shù)據(jù)源:Reader 數(shù)據(jù)匯:Writer
- 如果不是:數(shù)據(jù)源:InputStream 數(shù)據(jù)匯:OutputStream
3 瞧挤,雖然確定了一個體系锡宋,但是該體系中有太多的對象,到底用哪個呢特恬?明確操作的數(shù)據(jù)設(shè)備执俩。
- 數(shù)據(jù)源對應(yīng)的設(shè)備:硬盤(File),內(nèi)存(數(shù)組)癌刽,鍵盤(System.in)
- 數(shù)據(jù)匯對應(yīng)的設(shè)備:硬盤(File)役首,內(nèi)存(數(shù)組)尝丐,控制臺(System.out)。
4 衡奥,需要在基本操作上附加其他功能嗎爹袁?比如緩沖。
- 如果需要就進行裝飾矮固。
根據(jù)規(guī)律實例化演示
需求:讀取鍵盤錄入呢簸,將數(shù)據(jù)存儲到一個文件中。
規(guī)律分析
1乏屯,明確體系:
- 源:InputStream ,Reader
- 目的:OutputStream 瘦赫,Writer
2辰晕,明確數(shù)據(jù):
- 源:是純文本嗎?是 Reader
- 目的确虱;是純文本嗎含友?是 Writer
3,明確設(shè)備:
- 源:鍵盤校辩,System.in
- 目的:硬盤窘问,F(xiàn)ileWriter
- InputStream in = System.in;
- FileWriter fw = new FileWriter("a.txt");
4,需要額外功能嗎宜咒?
- 需要惠赫,因為源明確的體系時Reader」屎冢可是源的設(shè)備是System.in儿咱。所以為了方便于操作文本數(shù)據(jù),將源轉(zhuǎn)成字符流场晶。需要轉(zhuǎn)換流混埠。
- InputStreamReader InputStreamReader isr = new InputStreamReader(System.in);
FileWriter fw = new FileWriter("a.txt");
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new FileWriter("a.txt"));
代碼實現(xiàn)
/**
* 通過鍵盤錄入文字輸出到文件
*/
public static void test3() {
BufferedWriter bufferedWriter = null;
BufferedReader bufferedReader = null;
try {
bufferedWriter = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(
"E:\\kejiang\\IdeaProjects\\JavaProjectTest\\src\\io\\SystemOut.txt"),"UTF-8"));
bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String s = "";
while ((s = bufferedReader.readLine()) != null) {
if ("over".equals(s)) {
break;
}
bufferedWriter.write(s.toUpperCase());
bufferedWriter.newLine();
bufferedWriter.flush();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bufferedWriter.close();
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
運行效果
- 控制臺
這是通過鍵盤錄入的數(shù)據(jù)
測試一下
over
Process finished with exit code 0
-
輸出的文件
這里寫圖片描述