java.io.*;
public abstract class Reader implements Readable,Closeable{}
public class BufferedReader extends Reader{
public BufferedReader(Reader in);建立一個使用預設大小輸入緩沖區的緩沖字元輸入流。
public BufferedReader(Reader in, int sz);建立一個使用指定大小輸入緩沖區的緩沖字元輸入流。
}
public class InputStreamReader extends Reader{
public InputStreamReader(InputStream in);建立一個使用預設字元集的 InputStreamReader。
public InputStreamReader(InputStream in, StringcharsetName); 建立使用指定字元集的InputStreamReader。
public InputStreamReader(InputStream in, Charset cs);建立使用給定字元集的 InputStreamReader。
public InputStreamReader(InputStream in, CharsetDecoderdec);建立使用給定字元集×××的 InputStreamReader。
}
public class FileReader extends InputStreamReader{
public FileReader(String fileName){ super(new FileInputStream(fileName));}
public FileReader(File file) {super(new FileInputStream(file));}
public FileReader(FileDescriptor fd) { super(newFileInputStream(fd)); }
}
public abstract classInputStream implements Closeable{}
public class FileInputStream extends InputStream{
public FileInputStream(String name) throws FileNotFoundException {this(name != null ? new File(name) : null); }
public FileInputStream(File file);
public FileInputStream(FileDescriptorfdObj);
FileInputStream從檔案系統中的某個檔案中獲得輸入位元組。
public class File implements Serializable,Comparable<File>{
public File(String pathname);
public File(String parent,String child);
public File(File parent, String child);
public File(URI uri);
Reader是用于讀取字元流的抽象類;InputStream提供的是位元組流的讀取,而非文本讀取,這是和Reader類的根本差別。即用Reader讀取出來的是char數組或者String ,使用InputStream讀取出來的是byte數組。
BufferedReader 由Reader類擴充而來,提供通用的緩沖方式文本讀取,而且提供了很實用的readLine,讀取分行文本很适合,BufferedReader是針對Reader的,不直接針對檔案,也不是隻針對檔案讀取。BufferedReader的最大特點就是緩沖區的設定。通常Reader所作的每個讀取請求都會導緻對底層字元或位元組流進行相應的讀取請求,如果沒有緩沖,則每次調用 read() 或 readLine() 都會導緻從檔案中讀取位元組,并将其轉換為字元後傳回,而這是極其低效的。 使用BufferedReader可以指定緩沖區的大小,或者可使用預設的大小。大多數情況下,預設值就足夠大了。是以,建議用 BufferedReader 包裝所有其 read() 操作可能開銷很高的 Reader(如 FileReader 和InputStreamReader)。例如:
BufferedReader in = new BufferedReader(newInputStreamReader(System.in));
InputStreamReader 是位元組流通向字元流的橋梁:它使用指定的 charset 讀取位元組并将其解碼為字元。它使用的字元集可以由名稱指定或顯式給定,或者可以接受平台預設的字元集。
每次調用 InputStreamReader 中的一個 read() 方法都會導緻從底層輸入流讀取一個或多個位元組。InputStreamReader最大的特點是可以指轉換的定編碼格式,這是其他類所不能的,從構造方法就可看出,這一點在讀取中文字元時非常有用。
FileReader與它的父類InputStreamReader的主要不同在于構造函數,主要差別也就在于構造函數!
InputStream是表示位元組輸入流的所有類的超類。
我們都知道計算機能識别的隻有0和1,資料是以位元組為機關存儲的。
a.故在java中,我們若想要從檔案中讀取一個字元,首先我們需要有一個檔案(資料源),于是我們就使用到了File類來制定一個檔案;
b. 因為資料在計算機中都是0和1代碼,以位元組為機關,是以我們所指定的file對象就需要先轉化成位元組流,是以需要用到InputStream類;
c. 這時候,如果在java中隻是以位元組來讀取檔案的話,就足夠了。但是如果想要以字元來讀取檔案的話,還需要對位元組流進行以某種方式編碼,因為不同的字元采用不同的編碼方式,如果仍然使用位元組流的話,可能會達不到我們想要的效果。我們可以指定字元編碼方式,這個通過在InputStreamReader相關類的構造器中指定并執行個體化,預設下是Unicode編碼方式。到了這裡,我們已經用到了InputStreamReader。
d. 經過了上面三個步驟,我們已經可以從檔案中讀取到一個字元了,但是每次隻讀取一個字元又不能滿足我們讀取大資料的需求,這時候BufferedReader就派上用場了。從名字中的Buffer我們可以推測出它具有緩沖的作用,事實也是如此,它可以一次讀取多個字元,一次性讀取的字元數目還可以自由設定。
用法:
Filefile = newFile("E:/abc/1.txt");
1. if(!file.exists())
2. {
3. try {
4. file.getParentFile().mkdir(); //如果檔案夾不存在則先建立檔案夾
5. file.createNewFile();
6. } catch (IOException e) {
7. // TODO Auto-generated catch block
8. e.printStackTrace();
9. }
10. }
(1)FileInputStream fit = new FileInputStream(file);//以二進制方式處理,不會出現亂碼現象;處理非純文字檔案;-讀取出來是byte資料
InputStreamReader isr = new InputStreamReader(fit,"UTF-8");
BufferedReader br = new BufferedReader(isr);
//InputStreamReader讀取char資料
int ch = 0;
while((ch=isr.read())!=-1){ System.out.println((char)ch); }
(2)FileReader fr = new FileReader(file);//處理純文字檔案,InputStreamReader的子類
//FileReader讀取char資料
while((ch = fr.read())!=-1 ) {System.out.println((char)ch); }
(3)FileReader fr = new FileReader(file);
BufferedReaderbr = newBufferedReader(fr);
//BufferedReader讀取String資料