首
java.io中有百萬計的類,如何找到自己需要的部分?
流
IO涉及到一個“流”stream的概念,可以簡單理解成數據從一個源頭到一個目的地。明白數據從哪來,要到哪里去,數據流中是字節還是字符之后,才能找到自己需要的類。
字節流
根據流中內容可以分為字節流(一般處理二進制數據)和字符流(一般處理文本數據)。
字節流的兩個基類:InputStream和OutputStream,分別表示流的源頭和流的目的地。如FileInputStream表字節流的源頭是文件,即從文件中拿數據。FileOutputStream表字節流的目的地是文件,即向文件中輸送。
此外,為了讓流具有緩沖作用,還提供了BufferedInputStream和BufferedOutputStream。
比如將一個對象序列化進文件:
FileOutputStream fs = new FileOutputStream("file.ser");
ObjectOutputStream os = new ObjectOutputStream(fs); //obj通過ObjectOutputStream向fs輸出os.writeObject(obj);
將數據裝入文件,流的目的地是文件,故選擇FileOutputStream。流中內容為字節,而要輸入的數據是對象,為了將對象向字節進行轉換,插入了ObjectOutputStream。當對象進入ObjectOutputStream后,obj會被轉為字節,之后字節進入FileOutputStream流,最終“流”向文件。
可以看到,每個stream都有自己的功能,我們只需要拼接它們就好了。
字符流
當處理文本數據時,使用字符流。兩個基類Reader和Writer,分別表示流的源頭和目的地。如FileReader表字符流的源頭是文件,即從文件中讀數據。FileWriter表字符流的目的是文件,即向文件寫數據。
除了提供了緩沖功能BufferedReader和BufferedWriter外,還提供了InputStreamReader和OutputStreamWriter用來將InputStream和OutputStream轉為Reader和Writer,方便進行文本處理。
例如,從一個socket中讀取文本:
Socket soc = new Socket("xx", xx);
InputStreamReader ir = new InpuStreamReader(soc.getInputStream());
BufferedReader br = new BufferedReader(ir)
String msg = br.readLine()
從socket讀取數據,即socket向流中輸入數據,流的源頭是socket,故要獲取socket的輸入流。因為我們要讀取文本內容,而不想讀取字節數據,故通過InputStreamReader將字節流轉為字符流。
為了讓流具有緩沖作用,再接上BufferedReader,之后便可以從流中讀取數據了。
那向socket中發送文本數據呢?
可以把上面的數據改改,Input改成Output,reader改成writer。這里說另一個類PrintWriter,類重載了很多構造方法,能夠接受String,File,OutputStream以及Writer,流內數據類型的轉換自己可以完成,且自帶緩沖。
Socket soc = new Socket("xx", xx);
PrintWriter pw = new PrintWriter(soc.getOutputStream());
pw.println("xx")
尾
流需要考慮三個方面:數據從哪來,數據到哪去,流中數據的類型。之后再根據自己的業務需求將不同功能的流拼接即可。