前言
前面給小夥伴們分享了我了解的Java多線程,這裡給大家分享一下我了解的IO流(檔案操作)。IO流在程式設計開發中,我們會經常使用到。IO流的體系很龐大仔細區分有16種,但是我們可以了解成位元組流和字元流。
IO流概述
IO流簡單來說就是Input和Output流,IO流主要是用來處理裝置之間的資料傳輸,Java對于資料的操作都是通過流實作,而Java用于操作流的對象都在IO包中。
IO流架構圖
如何讀寫檔案?
通過流來讀寫檔案,流是指一連串流動的字元,是以先進先出方式傳遞,輸入輸出流是相對于計算機記憶體來說的,位元組流是8位通用位元組流,字元流是16位Unicode字元流。
位元組流:一次讀入或讀出是8位二進制。
字元流:一次讀入或讀出是16位二進制。
位元組流和字元流的異同
位元組流和字元流原理時相同的,隻不過處理的機關不同而已。字尾是Stream是位元組流,而字尾是Reader或者Writer是字元流。
位元組流
InputStream 位元組讀取
int read();抽象方法,擷取下一個位元組,如果下一個沒有了,傳回-1
int read(byte[] buf);讀取一定的位元組到位元組數組,傳回讀到的長度,如果沒有讀到傳回-1
read(byte[] buf, int offset, int length);從流中讀取length長度的位元組放入buf中的offset開始的地方
FileInputStream 檔案讀取方式
代碼示例:
InputStream is = null;
try{
is = new FileInputStream(file);
byte[] buf =new byte[緩沖區長度 一般是1024];
int len = 0;
while((len = is.read(buf))!=-1){
儲存is
}
}catch(Exception e){
e.printStackTrace();
}finally{
try{
is.close();//每次使用必須關閉流
}catch(IOException e){
e.printStackTrace();
}
}
OutputStream位元組輸出
fluch();将緩沖區重新整理,并且輸出,每次使用OutputStream必須調用
write(byte[]);
FlieOutputStream将資料寫入檔案
代碼示例:
OutputStream os =null;
try{
os = new FileOutputStream(file);
os.write("内容".getBytes());
os.flush();//重新整理
}catch(Exception e){
e.printStackTrace();
}finally{
try{
os.close();
}catch(IOException e){
e.printStackTrace();
}
}
windows中 換行是\r\n
Java中基本資料類型的讀取和存儲
DataInputStream
DataOutputStream
用來讀取和儲存Java基本資料類型,其實是供ObjectInputStream和ObjectOutputStream來提供對象持久化存儲的工具。
對象序列化
将一個對象永久的儲存,對象必須實作Serializable接口,并且給一個UID。
ObjectInputStream
ObjectOutputStream
writeObject用來存儲對象
readObject用來讀取對象
ByteArrayInputStream,ByteArrayOutputStream
隻是讀寫的是記憶體緩沖區(位元組數組)。
字元流
- 字元流讀取字元,需要一個緩沖區,将位元組轉成字元。
- 複制檔案的時候,它隻能複制文本檔案。位元組流可以複制任意檔案。
- 複制檔案首先選位元組流,字元流隻是做需要讀取文本的時候。
- 讀取文本的時候,不會再出現亂碼。
Reader,Writer
用來讀取讀取文本檔案的所有類的父類
read();
read(char[]);
writer(char[]);
writer(String);
FileReader,FileWriter
用來讀寫文本檔案
使用FileWriter必須要在寫入後調用flush方式來重新整理緩沖區。
讀取和InputStream相同,将byte數組換成char數組
BuffereReader,BuffereWriter
帶緩沖區的流,可以不再讀取到數組中,自己内部就有緩沖區。
BuffereReader多了一個 readLine的方法,用來讀取一行,每次讀取到最近的\n。
BuffereWriter多了一個 newLine的方法,保證在任何的作業系統中都可以換行。
代碼示例:
StringBuffer sb = new StringBuffer();
String line =null;
try{
while((line =br.readLine())!=null){
//有資料
}
}
轉接流
InputStreamReader,OutputStreamWriter
将位元組流轉成字元流。
主要為了網絡部分服務,網絡中傳遞都是位元組,沒有字元。
過濾器
代碼示例:
File[] listFiles =file.listFiles(new FileFilter(){
//白名單管理
//必須符合accept方法中傳回true的才能被傳回
@Override
public boolean accept(File pathname){
if(pathname.getName().endsWith(".html"))
return true;
return false;
}
});