實作功能:將檔案系統中的檔案內容讀取出來并在 控制臺列印
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));
?
}
}
} -
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/457042.html
標籤:其他
