/*
字符流:
FileReader
FileWriter。
BufferedReader
BufferedWriter
字節流:
FileInputStream
FileOutputStream
BufferedInputStream
BufferedOutputStream
通過剛纔的鍵盤錄入一行數據並打印其大寫,發現其實就是讀一行數據的原理。
也就是readLine方法。
能不能直接使用readLine方法來完成鍵盤錄入的一行數據的讀取呢?
readLine方法是字符流BufferedReader類中的方法。
而鍵盤錄入的read方法是字節流InputStream的方法。
那麼能不能將字節流轉成字符流在使用字符流緩衝去的readLine方法呢?
*/
import java.io.*;
class TransStreamDemo
{
public static void main(String[] args) throws IOException
{
//獲取鍵盤錄入對象。
//InputStream in = System.in;
//將字節流對象轉成字符流對象,使用轉換流。InputStreamReader
//InputStreamReader isr = new InputStreamReader(in);
//爲了提高效率,將字符串進行緩衝區技術高效操作。使用BufferedReader
//BufferedReader bufr = new BufferedReader(isr);
//鍵盤的最常見寫法。
BufferedReader bufr =
new BufferedReader(new InputStreamReader(System.in));
// OutputStream out = System.out;
// OutputStreamWriter osw = new OutputStreamWriter(out);
// BufferedWriter bufw = new BufferedWriter(osw);
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
String line = null;
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
bufw.write(line.toUpperCase());
bufw.newLine();
bufw.flush();
}
bufr.close();
}
}
import java.io.*;
/*
1,
源:鍵盤錄入。
目的:控制檯。
2,需求:想把鍵盤錄入的數據存儲到一個文件中。
源:鍵盤。
目的:文件。
3,需求:想要將一個文件的數據打印在控制檯上。
源:文件。
目的:控制檯。
流操作的基本規律:
最痛苦的就是流對象有很多,不知道該用哪一個。
通過三個明確來完成。
1,明確源和目的。
源:輸入流。InputStream Reader
目的:輸出流。OutputStream Writer。
2,操作的數據是否是純文本。
是:字符流。
不是:字節流。
3,當體系明確後,在明確要使用哪個具體的對象。
通過設備來進行區分:
源設備:內存,硬盤。鍵盤
目的設備:內存,硬盤,控制檯。
1,將一個文本文件中數據存儲到另一個文件中。複製文件。
源:因爲是源,所以使用讀取流。InputStream Reader
是不是操作文本文件。
是!這時就可以選擇Reader
這樣體系就明確了。
接下來明確要使用該體系中的哪個對象。
明確設備:硬盤。上一個文件。
Reader體系中可以操作文件的對象是 FileReader
是否需要提高效率:是!。加入Reader體系中緩衝區 BufferedReader.
FileReader fr = new FileReader("a.txt");
BufferedReader bufr = new BufferedReader(fr);
目的:OutputStream Writer
是否是純文本。
是!Writer。
設備:硬盤,一個文件。
Writer體系中可以操作文件的對象FileWriter。
是否需要提高效率:是!。加入Writer體系中緩衝區 BufferedWriter
FileWriter fw = new FileWriter("b.txt");
BufferedWriter bufw = new BufferedWriter(fw);
練習:將一個圖片文件中數據存儲到另一個文件中。複製文件。要按照以上格式自己完成三個明確。
---------------------------------------
2,需求:將鍵盤錄入的數據保存到一個文件中。
這個需求中有源和目的都存在。
那麼分別分析
源:InputStream Reader
是不是純文本?是!Reader
設備:鍵盤。對應的對象是System.in.
不是選擇Reader嗎?System.in對應的不是字節流嗎?
爲了操作鍵盤的文本數據方便。轉成字符流按照字符串操作是最方便的。
所以既然明確了Reader,那麼就將System.in轉換成Reader。
用了Reader體系中轉換流,InputStreamReader
InputStreamReader isr = new InputStreamReader(System.in);
需要提高效率嗎?需要!BufferedReader
BufferedReader bufr = new BufferedReader(isr);
目的:OutputStream Writer
是否是存文本?是!Writer。
設備:硬盤。一個文件。使用 FileWriter。
FileWriter fw = new FileWriter("c.txt");
需要提高效率嗎?需要。
BufferedWriter bufw = new BufferedWriter(fw);
**************
擴展一下,想要把錄入的數據按照指定的編碼表(utf-8),將數據存到文件中。
目的:OutputStream Writer
是否是存文本?是!Writer。
設備:硬盤。一個文件。使用 FileWriter。
但是FileWriter是使用的默認編碼表。GBK.
但是存儲時,需要加入指定編碼表utf-8。而指定的編碼表只有轉換流可以指定。
所以要使用的對象是OutputStreamWriter。
而該轉換流對象要接收一個字節輸出流。而且還可以操作的文件的字節輸出流。FileOutputStream
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("d.txt"),"UTF-8");
需要高效嗎?需要。
BufferedWriter bufw = new BufferedWriter(osw);
所以,記住。轉換流什麼使用。字符和字節之間的橋樑,通常,涉及到字符編碼轉換時,
需要用到轉換流。
練習:將一個文本數據打印在控制檯上。要按照以上格式自己完成三個明確。
*/
class TransStreamDemo2
{
public static void main(String[] args) throws IOException
{
System.setIn(new FileInputStream("PersonDemo.java"));
System.setOut(new PrintStream("zzz.txt"));
//鍵盤的最常見寫法。
BufferedReader bufr =
new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
String line = null;
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
bufw.write(line.toUpperCase());
bufw.newLine();
bufw.flush();
}
bufr.close();
}
}
IO流——轉換流InputStreamReader、OutputStreamWriter
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.