一) io流 (input output)
單位:
字節流
InputStream/OutputStream
字符流
Reader/Writer
流向:
輸入流
InputStream/Reader
輸出流
OutputStream/Writer
如上,IO流根據單位可以分爲字節流和字符流,根據流向有輸入輸出流。
二) 字節流
1) FileInputStream/FileOutputStream
1) 按字節讀取
int read();
返回值:如果到文件末尾,返回-1,
2) 按字節數組讀取(可適當提高效率)
2) 字節高效流
BufferedInputStream/BufferedOutputStream //相當於物流快遞中的物流中心
三) 字符流
字符流涉及到的比較頭疼的問題是編碼問題,這裏大概提一下編碼,等有時間我寫一篇總結編碼遇到的問題。
1) 編碼集
ASCII
iso8859-1 西方國家的編碼
中國
gbk -> gb2312
big5 繁體
日本
JIS
萬國碼
unicode 以兩個字節存一個字符,java的默認編碼集
utf-8 能用一個字節存就用一個,存不下用兩個,兩個不行用三個
ANSI: 平臺碼
現在有一個需求是亂碼問題,該如何解決???現將字符流轉換成字節流,然後再將字節流轉換成對應編碼的字符流,這裏需要用到轉換流
2) 轉換流: InputStreamReader (把字節流轉爲字符流,可以指定編碼集)
InputStreamReader(InputStream in, String charsetName)
OutputStreamWriter(OutputStream out,String charsetName)
解決亂碼問題
package cn.edu.suda;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class IOliu {
public static void main(String[] args) {
/**
* 簡單實現圖片的讀取與寫入,其中resource/常量池.png是我的圖片在項目下的相對路徑,這個路徑也可以寫絕對的
* d:/test.png是我的圖片的存放位置
*
*/
File file=new File("resource/常量池.png");
FileInputStream fis;
FileOutputStream fos;
try {
fis=new FileInputStream(file);
fos=new FileOutputStream("d:/test.png");
int data=0;
while((data=fis.read())!=-1){
fos.write(data);
}
fis.close();
fos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
這是我筆記裏面的內容,截的圖是老師的代碼,有興趣可以自己嘗試
3) 字符流 (讀寫字符,不能指定編碼集)
FileReader/FileWriter
和轉換流的區別:
1) 不能指定編碼集,按照系統平臺碼
2) 不需要字節流
4) 字符高效流
BufferedReader
readLine()
BufferedWriter
newLine()
flush()
四) 序列化與反序列化
序列化: 序列化是將對象的狀態寫入到特定的流中的過程
ObjectOutputStream
|--- writeObject(Object obj)
反序列化: 反序列化則是從特定的流中獲取數據重新構建對象的過程
ObjectInputStream
|--- Object readObject()
自定義對象需要實現序列化接口
注意:序列化後如果修改類可能會報錯,需要固定UID
注意:自定義對象序列化的時候要實現一個接口
在IO流中處理異常的習慣做法:
關於這些流之間的差別,我百度到一篇,寫的蠻詳細的
java的io流是一個很重要的概念,需要多加練習,筆者仍然記得初學的時候,看似簡單,用的時候報錯報到懷疑人生。。。這次偷個懶,等下次報錯了,專門寫個博客總結報錯。
很開心,博客上的代碼終於好看了,哈哈哈哈哈哈。。。原來代碼的標籤我寫錯了。