實現功能:將文件系統中的文件內容讀取出來並在 控制台打印
FileInputStream:從文件系統中的文件獲取輸入字節
構造方法:
FileInputStream(String name):通過打開與實際文件的連接來創建一個FileInputStream,該文件由文件系統中的路徑名name命名
使用字節輸入流讀數據的步驟:
1.創建字節輸入流對象
2.調用字節輸入流對象的讀數據方法
3.釋放資源
一次讀取一個字節數據:
/*1.創建字節輸入流對象
2.調用字節輸入流對象的讀數據方法
3.釋放資源
* */
public class FileInputStreamDemo {
public static void main(String[] args) throws IOException {
//創建字節輸入流對象
FileInputStream fips=new FileInputStream("E:\\abc.txt");
//調用字節輸入流對象的讀數據方法
//int read():從該輸入流讀取一個字節的數據
int read = fips.read();
System.out.println(read);
System.out.println((char) read);
//釋放資源
fips.close();
}
}
在上面代碼中我們可以看到使用read方法可以讀取一個字節的數據,並進行強制類型轉換;但我們如果想要使用此方法將文件中的數據全部讀出時也是可以的。經過測試可以發現,如果我們想要實現全部讀取數據只需要在第一次讀取后再增加數次讀取行為就可以了,當讀取到文件中數據的末尾時返回-1就說明讀取完畢,我們可以這樣寫:
public class FileInputStreamDemo {
public static void main(String[] args) throws IOException {
//創建字節輸入流對象
FileInputStream fips=new FileInputStream("E:\\abc.txt");
//調用字節輸入流對象的讀數據方法
//int read():從該輸入流讀取一個字節的數據
int read;
while((read=fips.read())!=-1){
System.out.print((char)read);
}
//釋放資源
fips.close();
}
}
一次讀取一個字節數組數據:
例如:文本中有hello\r\nworld\r\n這些數據,其中\r\n為換行符
一次讀取一個字節數組數據的操作基本與一次讀取一個字節數據相同,相同的是都需要通過多次讀取實現將文件內容全部讀取,不同的是讀取一個字節數組數據有幾個需要注意的問題:
首先我們先寫出第一次的讀取步驟:
public class FileInputStreamDemo01 {
public static void main(String[] args) throws IOException {
//創建對象
FileInputStream fips=new FileInputStream("E:\\abc.txt");
//讀取數據,一次讀取一個字節數組數據
//定義一個字節數組用來接收
byte[] bytes =new byte[5];//通常是1024或者它的整數倍
int len = fips.read(bytes);//獲取實際讀取的長度
System.out.println(len);
//String(byte[] bytes)
//通過使用平台的默認字符集解碼指定的字節數組來構造新的 String 。
//可以直接將一個字節數組轉換為字符串
System.out.println(new String(bytes));
//釋放資源
fips.close();
}
}
其中我們需要知道的是len是獲取了這次讀取數據的實際長度,第一次讀取數據后顯示長度為5,數據為hello沒有問題
但當我們第二次讀取數據時會發現控制台輸出的長度同樣為5,但數據只有wor,這是因為在讀取時默認將換行符\r\n也讀取了,實際上是\r\nwor這個數據
按照這個思路來說,第三次讀取應該讀取ld\r\nr,因為這次只讀取了四個數據,所以只把前四個數據替換掉了,結果也是如此
綜合看來這樣太麻煩了,那么有沒有一種方法來讓它實際讀取幾個長度就輸出幾個長度呢?
String類中有這樣一個構造方法:
String(byte[] bytes, int offset, int length)通過使用平台的默認字符集解碼指定的字節子陣列來構造新的
String` 。
-
//String(byte[] bytes, int offset, int length)
//通過使用平台的默認字符集解碼指定的字節子陣列來構造新的 String 。
System.out.println(new String(bytes,0,len));這樣我們就可以很好的解決了這個問題
然后我們再進行循環實現重復獲取數據即可,同上讀取到文件沒有剩余數據時返回-1;
public class FileInputStreamDemo02 {
public static void main(String[] args) throws IOException {
//創建對象
FileInputStream fips=new FileInputStream("E:\\abc.txt");
//循環實現取數據
byte [] bytes=new byte[5];
int len;
while((len=fips.read(bytes))!=-1){
System.out.print(new String(bytes,0,len));
}
}
} -