java.io.*;java
public abstract class Reader implements Readable,Closeable{}數組
public class BufferedReader extends Reader{ide
public BufferedReader(Reader in);建立一個使用默認大小輸入緩衝區的緩衝字符輸入流。函數
public BufferedReader(Reader in, int sz);建立一個使用指定大小輸入緩衝區的緩衝字符輸入流。大數據
}this
public class InputStreamReader extends Reader{編碼
public InputStreamReader(InputStream in);建立一個使用默認字符集的 InputStreamReader。spa
public InputStreamReader(InputStream in, StringcharsetName); 建立使用指定字符集的InputStreamReader。 code
public InputStreamReader(InputStream in, Charset cs);建立使用給定字符集的 InputStreamReader。orm
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數據
int ch = 0;
while((ch = fr.read())!=-1 ) {System.out.println((char)ch); }
(3)FileReader fr = new FileReader(file);
BufferedReaderbr = newBufferedReader(fr);
//BufferedReader讀取String數據
String ch = "";
while((ch=br.readLine())!=null){System.out.println(ch);}