Java中的IO流總結(續)
IO流中的轉換流
OutputStreamWriter是字元流通向位元組流的橋樑,可使用指定的字元流編碼表,將要寫入流中的字元編嗎成位元組,將字串按照指定的編嗎錶轉成位元組,再使用位元組流將這些位元組寫出去。對於字元轉換成位元組輸出的原理,在我們呼叫OutputStreamWriter物件的write方法時,會拿著字元到指定的碼錶中進行查詢,把查到的字元編碼值轉換成位元組數存放到OutputStreamWriter緩衝區中。然後再呼叫重新整理功能,或者關閉流,或者將緩衝區存滿後會把緩衝區中的位元組資料使用位元組流寫到指定的檔案中。
FileOutputStream fos = new FileOutputStream("c:\\cn8.txt"); //建立可以把字元轉成位元組的轉換流物件,並指定編碼 OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8"); //呼叫轉換流,把文字寫出去,其實是寫到轉換流的緩衝區中 osw.write("你好");//寫入緩衝區。 osw.close();
InputStreamReader是位元組流通向字元流的橋樑:它使用指定的字元編嗎表讀取位元組並將其解碼為字元。它使用的字符集可以由名稱指定或顯示給定,或者接收平臺預設的字符集。在讀取指定的編嗎的檔案時,一定要指定編嗎格式,否則會發生解碼錯誤變成亂碼。
緩衝流
提高讀寫的速度可以利用緩衝流,緩衝輸出流BufferedOutputStream和緩衝輸入流BufferedInputStream,都是通過緩衝區來讀寫的。
private static void write() throws IOException { //建立基本的位元組輸出流 FileOutputStream fileOut = new FileOutputStream("abc.txt"); //使用高效的流,把基本的流進行封裝,實現速度的提升 BufferedOutputStream out = new BufferedOutputStream(fileOut); //2,寫資料 out.write("hello".getBytes()); //3,關閉流 out.close();
字元緩衝流有緩衝輸入流BufferedReader和緩衝輸出流BufferedWriter。
用於從流中取出物件的操作流ObjectInputStream稱為反序列化流,用於向流中寫入物件的操作流ObjectOutputStream稱為序列化流。它們用於操作物件,可以將物件寫入到檔案中,也可以從檔案中讀取物件。
//1,明確儲存物件的檔案。 FileOutputStream fos = new FileOutputStream("tempfile\\obj.object"); //2,給操作檔案物件加入寫入物件功能。 ObjectOutputStream oos = new ObjectOutputStream(fos); //3,呼叫了寫入物件的方法。 oos.writeObject(new Person("wangcai",20)); //關閉資源。 oos.close();
當一個物件能被序列化,這個物件所屬的類必須實現Serializable介面,否則會發生異常NotSerializableException異常。同時當反序列化物件時,如果物件所屬的class檔案在序列化之後進行的修改,那麼進行反序列化也會發生異常InvalidClassException。
對IO流進行了規律的總結:
1.看操作的資料是資料來源還是資料目的。(先根據需求明確要讀,還是要寫)
源:InputStream Reader
目的:OutputStream Writer
2.要操作的資料是位元組還是文字(明確到具體的體系上)
源:
位元組:InputStream
文字:Reader
目的
位元組:OutputStream
文字:Writer
3.根據資料所在的具體裝置
源(目的)裝置:
硬碟:檔案 File開頭
記憶體:陣列,字串
鍵盤(螢幕):System.in(System.out)
網路:Socket
4.看是否需要額外功能:
額外功能:
轉換:InputStreamReader OutputStreamWriter
高效:緩衝區物件 Buffered***