天天看點

Java筆記41——檔案操作(IO流)

前言

前面給小夥伴們分享了我了解的Java多線程,這裡給大家分享一下我了解的IO流(檔案操作)。IO流在程式設計開發中,我們會經常使用到。IO流的體系很龐大仔細區分有16種,但是我們可以了解成位元組流和字元流。

IO流概述

IO流簡單來說就是Input和Output流,IO流主要是用來處理裝置之間的資料傳輸,Java對于資料的操作都是通過流實作,而Java用于操作流的對象都在IO包中。

IO流架構圖

Java筆記41——檔案操作(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

隻是讀寫的是記憶體緩沖區(位元組數組)。

字元流

  1. 字元流讀取字元,需要一個緩沖區,将位元組轉成字元。
  2. 複制檔案的時候,它隻能複制文本檔案。位元組流可以複制任意檔案。
  3. 複制檔案首先選位元組流,字元流隻是做需要讀取文本的時候。
  4. 讀取文本的時候,不會再出現亂碼。

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;	 
	  }
	});