JAVA—IO操作
一、JAVA I/O 輸入輸出流
1:編碼問題
2:File類的使用
3:RandomAccessFile的使用
4:位元組流的使用
5:字元流的使用
6:物件的序列化和反序列化
2: file類的使用。
java.io.file類用於表示檔案(目錄)
File類只用於表示檔案(目錄)的資訊(名稱,大小等),不能用於檔案內容的訪問。
3:RandomAccessFile的使用
RandomAccessFile java 提供的對檔案內容的訪問,既可以讀檔案,也可以寫檔案。
RandomAccessFile 支援隨機訪問檔案,可以訪問檔案的任意位置。
(1)java 檔案模型
在硬碟上的檔案是 byte byte byte 儲存的,是資料的集合。
(2)開啟檔案
有兩種模式,“rw” (讀寫) “r”(只讀)
RandomAccessFile raf=new RandomAccessFile(file,"rw");
檔案指標,開啟檔案時指標在開頭 pointer=0;
(3)寫方法。
raf.write(int)---> 只寫一個位元組(後八位),同時指標指向下一個位置,準備再次寫入。
(4)讀方法。
int b = raf.read(); ---> 讀一個位元組
(5)檔案讀寫完成以後一定要關閉(Oracle官方說明)。
4:位元組流的使用。
IO流,(輸入流,輸出流)
位元組流,字元流.
1、位元組流。
InputStream/OutputStream
InputStream 抽象了應用程式讀取資料的方式。
OutputStream 抽象了應用程式寫出資料的方式。
2、EOF = End 讀到 -1 就讀到結尾。
3、輸入流基本方法
int b = in.read(); 讀取一個位元組無符號 填充到 int 低 八位 , -1是EOF。
in.read(byte[] buf); 讀取資料填充到 位元組陣列 buf
in.read(byte[] buf,int start,int size);
4、輸出流基本方法。
out.write(int b); 寫出一個byte 到 流,b的 低8位。
out.write(byte[] buf) 將buf位元組陣列都寫入到流。
out.write(byte[] buf , int start,int size)
5、FileInputStream ---> 具體實現了在檔案上讀取資料
6、FileOutputStream 實現了向檔案中寫出byte資料的方法。
7、DataOutputStream/DataInputStream
對“流”功能的擴充套件,可以更加方面的讀取 int,long, 字元等型別資料。
DataOutputStream
writeInt()/writeDouble()/writeUTF()
8、BufferedInputStream&BufferedOutputStream
這兩個流類位 IO提供了帶緩衝區的操作,一般開啟檔案進行寫入,
或讀取操作時,都會加上緩衝,這種流模式提高了IO的效能。
從應用程式中把輸入放入檔案,相當於將一缸水倒入另一缸中。
FileOutputStream--->write() 方法相當於一滴一滴的把水“轉移過去”
DataOutputStream--->writeXxx() 方法會方便些,相當於一瓢一瓢把水“轉移”過去。
BufferedOutputStream--->write方法更方便,相當於一瓢一瓢先放入桶中,再從桶中倒入到另一個桶中。
5、字元流。
1、編碼問題。
2、認識文字和文字檔案。
java的文字(char)是16位無符號整數,是字元的unicode編碼(雙位元組編碼)
檔案是byte byte byte...的資料序列。
文字檔案是文字(char)序列按照某中編碼方案(utf-8,utf-16be,gbk)序列化為byte的儲存結果。
3、字元流(Reader Writer)
字元的處理,一次處理一個字元。
字元的底層任然是基本的位元組序列。
字元流的基本實現
InputStreamReader 完成byte流解析為char流,按照編碼解析
OutputStreamWriter 提供char流到byte流,按照編碼處理
FileReader/FileWriter
字元流過濾器
BufferedReader ---> readLine 一次讀一行
BufferedWriter ---> PrintWriter 寫一行
6、物件的序列化和反序列化
1、物件序列化,就是將Object轉換成byte序列,反之叫物件的反序列化
2、序列化流(ObjectOutputStream)是過濾流
反序列化流(ObjectInputStream)---readObject
3、 序列化介面(Serializable)
物件必須是新序列化介面,才能進行序列化,否則將出現異常。
這個介面,沒有任何方法,只是一個標準。
4、transient關鍵字
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException,ClassNotFoundException
分析ArrayList原始碼
5、序列化中子類和父類建構函式的呼叫問題
原始碼 地址 :https://github.com/Yahuiya/studyJava/tree/master/src/com/imooc/io