一、FileReader
1、FileReader 類概述
java.io.FileReader 類是讀取字符文件的子類。構造時使用系統默認的字符編碼和默認字符緩沖區。
FileReader 是用來操作字符文件的輸入流,可以從字符文件中進行讀取。
Tips:
① 字符編碼:字節與字符的對應規則,Windows 系統的中文編碼默認是GBK編碼表,或者為 UTF-8;
② 字符緩沖區:一個字節數組,用來臨時存儲字節數據;
2、FileReader 類結構及方法
3、構造方法
FileReader(File file) : 創建一個新的 FileReader ,給定要讀取的File對象。
FileReader(String fileName) : 創建一個新的 FileReader ,給定要讀取的文件的名稱。
參數:讀取文件的數據源。
String fileName:文件的路徑
File file:文件對象
構造方法的作用:
① 創建一個 FileReader 對象
② 會把 FileReader 對象指向要讀取的文件
字符輸入流的使用步驟:
① 創建 FileReader 對象,構造方法中綁定要讀取的數據源(選擇IO流,創建IO對象)。
② 使用 FileReader 對象中的方法 read 讀取文件(讀/寫操作)。
③ 釋放資源(關閉IO流)。
二、常用方法
可以發現在 FileReader 中並為聲明過多的方法,都是調用其父類中已經存在的方法。
int read()
讀取單個字符。 作為整數讀取的字符, 范圍在 0 到 65535 之間 (0x00-0xffff)(2個字節的Unicode碼) , 如果已到達流的末尾, 則返回 -1
int read(char[] cbuf)
將字符讀入數組。 如果已到達流的末尾, 則返回 -1。 否則返回本次讀取的字符數。
int read(char[] cbuf,int off,int len)
將字符讀入數組的某一部分。 存到數組cbuf中, 從off處開始存儲, 最多讀len個字符。 如果已到達流的末尾, 則返回 -1。 否則返回本次讀取的字符數。
public void close() throws IOException
關閉此輸入流並釋放與該流關聯的所有系統資源。
三、案例
1、將工程下的hello.txt文件內容讀入程序中,並輸出到控制台
1 @Test 2 public void testFileReader() { 3 FileReader fileReader = null; 4 try { 5 //1. 實例化File類的對象,指明要操作的文件
6 File file = new File("hello.txt"); 7
8 //2.提供具體的流
9 fileReader = new FileReader(file); 10
11 //3.數據的讀入 12 //read():返回讀入的一個字符。如果達到文件末尾,返回-1 13 //方式一:
14 /*
15 int data = fileReader.read(); 16 while (data != -1) { 17 System.out.print((char)data); 18 data = fileReader.read(); 19 } 20 */
21 //方式二:語法上針對於方式一的修改
22 int data; 23 while ((data = fileReader.read()) != -1) { 24 System.out.print((char)data); 25 } 26
27 } catch (IOException e) { 28 e.printStackTrace(); 29 } finally { 30 //4.流的關閉操作 31 //方式一:
32 /*
33 try { 34 if (fileReader != null) { 35 fileReader.close(); 36 } 37 } catch (IOException e) { 38 e.printStackTrace(); 39 } 40 */
41 if (fileReader != null) { 42 try { 43 fileReader.close(); 44 } catch (IOException e) { 45 e.printStackTrace(); 46 } 47 } 48 } 49 }
read 方法,每次可以讀取一個字符的數據,提升為int類型,讀取到文件末尾,返回 -1 ,循環讀取。
2、使用read的重載方法
代碼實現:
1 //對read()操作升級:使用read的重載方法
2 @Test 3 public void testFileReader1() { 4 FileReader fileReader = null; 5 try { 6 //1. 實例化File類的對象,指明要操作的文件
7 File file = new File("hello.txt"); 8
9 //2.FileReader流的實例化
10 fileReader = new FileReader(file); 11
12 //3.讀入的操作 13 //read(char[] cbuf):返回每次讀入cbuf數組中的字符的個數。如果達到文件末尾,返回-1
14 char[] cbuf = new char[5]; 15 int len; //記錄的是每次讀取的有效字符個數 16 while((len = fileReader.read(cbuf)) != -1){ 17 //方式一: 18 //錯誤的寫法
19 /*
20 for(int i = 0;i < cbuf.length;i++){ 21 System.out.print(cbuf[i]); 22 } 23 */
24 //正確的寫法
25 /*
26 for (int i = 0; i < len; i++) { 27 System.out.print(cbuf[i]); 28 } 29 */
30
31 //方式二: 32 //錯誤的寫法,對應着方式一的錯誤的寫法 33 //String str = new String(cbuf); 34 //System.out.print(str); 35
36 //正確的寫法
37 String str = new String(cbuf,0,len); 38 System.out.print(str); 39 } 40 } catch (IOException e) { 41 e.printStackTrace(); 42 } finally { 43 //4.資源的關閉
44 try { 45 if (fileReader != null) { 46 fileReader.close(); 47 } 48 } catch (IOException e) { 49 e.printStackTrace(); 50 } 51
52 } 53 }
read(char[] cbuf) ,每次讀取b的長度個字符到數組中,返回讀取到的有效字符個數,讀取到末尾時,返回 -1。
3、
四、讀取文件注意點
1、異常的處理:為了保證流資源一定可以執行關閉操作。需要使用try-catch-finally處理;
2、讀入的文件一定要存在,否則就會報FileNotFoundException;
3、字符流操作字符,只能操作普通文本文件。 最常見的文本文件: .txt, .java, .c, .cpp 等語言的源代碼。尤其注意.doc,excel,ppt這些不是文本文件。