在日常的開發中我們經常會碰到對文件的操作,在java中對文件的操作都在java.io包下,這個包下的類有File、inputStream、outputStream、FileInputStream、FileOutputStream、reader、writer、FileReader、FileWriter ...
在日常的開發中我們經常會碰到對文件的操作,在java中對文件的操作都在java.io包下,這個包下的類有File、inputStream、outputStream、FileInputStream、FileOutputStream、reader、writer、FileReader、FileWriter等等,其中對文件的操作又分為兩大類,一類是字元流,一類是位元組流。所謂的字元流是以位元組(8b)為單位進行讀/寫,字元流即使用字元為單位讀/寫,java使用unicode編碼,一個字元兩個位元組,下麵分別對位元組流和字元流做如下闡述,
一、位元組流
位元組流即以位元組為單位進行讀/寫,使用於操作二進位文件,比如,圖像、視頻、音頻等文件。
在位元組流中又分為讀和寫,這裡的讀和寫是針對於程式而言。讀,即從磁碟讀取文件到程式;寫,即寫入內容到磁碟。
在位元組流中inputStream和outputStream作為讀和寫的抽象類,僅僅定義了一部分基本的方法,具體的操作由其子類完成。其子類如下圖所示,
這裡重點對FileInputStream和FileOutputStream進行說明。
FileInputStream是以位元組方式讀取的文件操作類,
其構造方法如下圖,
有三個構造方法,主要對第一個和第三個進行說明,第一個的參數為File對象,第三個為一個文件路徑,如果此文件路徑表示的文件不存在,則會拋出文件不存在的異常。
使用FileInputStream進行讀取文件時主要用到的方法有:read()、read(byte[] b),
read() 一次讀取一個位元組,返回值是此位元組int類型數值
read(byte[] b) 一次讀取b.length個位元組,返回值是讀取的位元組數
使用方法如下,
package cn.com.test; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class ReadFileByBytes { public static void main(String[] args) { // TODO Auto-generated method stub FileInputStream fis=null; try { fis=new FileInputStream("e:\\11.txt"); //1、使用read()方法讀取 int b; while((b=fis.read())!=-1){//如果返回值為-1,則代表文件已經讀完 //do something } //2、使用read(byte[] b)方式讀取 int bs;//存儲每次讀取的位元組數 byte[] bytes=new byte[1024];//定義一個1024個位元組的數組,作為緩衝池 while((bs=fis.read(bytes))!=-1){//返回值為-1,代表文件讀取完畢 //文件已經讀取到了bytes數組中 String str=new String(bytes);//使用每次的位元組數組生成字元串 } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ if(fis!=null){ try { fis.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }
以上代碼中分別使用兩種方式對文件進行了讀取,其返回值都是-1,-1代表的意思是讀到了文件末尾,文件已經讀取完畢,且最後需要關閉輸入流。
位元組方式的寫文件和讀文件相似,方法為write(int b)、write(byte[] b),即一次寫一個位元組,一次寫一個位元組數組。
二、字元流
字元流,即每次是以字元為單位讀/寫文件,在字元流中有Reader和Writer,其中reader的介紹如下,
reader也是一個抽象類,其子類主要有BufferedReader、FilterReader、InputStreamReader。在使用位元組流的時候,使用了FileInputStream,在字元流中也有FileReader,只不過是作為InputStreamReader的子類,InputStreamReader和BufferedReader是兩個很有意思的類,放在下次再說。
其構造方法和FileInputStream是一樣的,同樣我們常用的是以下兩個
下麵看具體的讀取方式,既然在FileInputStream中是按照位元組讀取,那麼在FileReader中即是按照字元讀取,read()和read(char[] c),第一個方法讀到的字元,以int類型返回,第二個方法返回讀取到的字元數。
package cn.com.test; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class ReadFileByChars { public static void main(String[] args) { // TODO Auto-generated method stub FileReader fr=null; try { fr=new FileReader("e:\\11.txt"); //1、使用read()方法讀取 int b; while((b=fr.read())!=-1){//如果返回值為-1,則代表文件已經讀完 //do something } //2、使用read(char c)方式讀取 int bs;//存儲每次讀取的字元數 char[] chars=new char[1024];//定義一個1024個字元的數組,作為緩衝池 while((bs=fr.read(chars))!=-1){//返回值為-1,代表文件讀取完畢 //文件已經讀取到了bytes數組中 String str=new String(chars);//使用每次的字元數組生成字元串 } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ if(fr!=null){ try { fr.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }
上面使用了read和read(char[] c)兩種方法讀取文件
使用字元的方式寫文件是一樣的,使用FileWriter類的writer(char c)和writer(char[] c)方法,分別寫入一個字元和字元數據組。
通過上面的說明我們發現,位元組和字元兩種方式操作文件的方式是大同小異的,使用的方法都是read和write方法,只是操作的單位不一樣。把這兩種方式放在一起更容易理解掌握,歡迎提出不同意見,謝謝!!!