IO流——轉換流InputStreamReader、OutputStreamWriter

/*
字符流:
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();

	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章