1. 程式人生 > >輸入輸出流--I/O流

輸入輸出流--I/O流

1)FileReader類介紹:
InputStreamReader類的子類,所有方法(read()等)都從父類InputStreamReader中繼承而來;
2)與InputStreamReader類的區別:
構造方法摘要  
(1)FileReader (File  file) 
   在給定從中讀取資料的 File 的情況下建立一個新 FileReader 。 
(2)FileReader (FileDescriptor  fd) 
   在給定從中讀取資料的 FileDescriptor 的情況下建立一個新 FileReader 。 
(3)FileReader (String  fileName) 
   在給定從中讀取資料的檔名的情況下建立一個新 FileReader  
該類與它的父類InputStreamReader的主要不同在於建構函式,主要區別也就在於建構函式!
從InputStreamReader的建構函式中看到,
引數為InputStream編碼方式,可以看出,當要指定編碼方式時必須使用InputStreamReader類;而FileReader建構函式的引數與FileInputStream同,為File物件或表示path的String,可以看出,當要根據File物件或者String讀取一個檔案時,用FileReader
我想FileReader子類的作用也就在於這個小分工吧。
二 聯絡與區別 
(1)字元與位元組: 
FileInputStream 類以二進位制輸入/輸出,I/O速度快且效率搞,但是它的read()方法讀到的是一個位元組(二進位制資料),很不利於人們閱讀,而且無法直接對檔案中的字元進行操作,比如替換,查詢(必須以位元組形式操作);

而Reader類彌補了這個缺陷,可以以文字格式輸入/輸出,非常方便;比如可以使用while((ch = filereader.read())!=-1 )迴圈來讀取檔案;可以使用BufferedReader的readLine()方法一行一行的讀取文字。
(2)編碼
InputStreamReader ,它是位元組轉換為字元的橋樑。 你可以在構造器重指定編碼的方式,如果不指定的話將採用底層作業系統的預設編碼方式,例如GBK等。 
FileReader與InputStreamReader 涉及編碼轉換(指定編碼方式或者採用os預設編碼),可能在不同的平臺上出現亂碼現象!而FileInputStream 以二進位制方式處理,不會出現亂碼現象. 

因此要指定編碼方式時,必須使用InputStreamReader 類,所以說它是位元組轉換為字元的橋樑;
(3) 快取區
    BufferReader類用來包裝所有其 read() 操作可能開銷很高的 Reader(如 FileReader 和InputStreamReader)。
(4)規範用法
總結以上內容,得出比較好的規範用法: 
1) File file = new File ("hello.txt"); 
FileInputStream in=new FileInputStream (file); 
2) File file = new File ("hello.txt"); 
FileInputStream in=new FileInputStream (file); 
InputStreamReader inReader=new InputStreamReader (in,"UTF-8"); 
BufferedReader bufReader=new BufferedReader(inReader); 
3) File file = new File ("hello.txt"); 
FileReader fileReader=new FileReader(file); 
BufferedReader bufReader=new BufferedReader(fileReader);