**IO流**
-
- 将檔案内容讀入到程式中,并且列印輸出到控制台
- 步驟
- 1.方法一
- 2.方式二.改造加強方法一
/*
* **一.流的分類:
* 1.按照操作資料分:位元組流byte,字元流char
* 2.按照資料流向: 輸入流inputStream,輸出流outputStream
* 3.流的角色: 節點流,和處理流:
*
* 二.流的體系結構
* 抽象基類 節點流(或檔案流) 緩沖流(處理流的一種)
* InputStream FileInputStream (io位元組) BufferedInputStream
* OutputStream FileOutPutStream (io位元組) BufferedOutputStream
* Reader FileReader (字元) BufferedReader
* Writer FileWriter (字元) BufferedWriter
***
*
* */
将檔案内容讀入到程式中,并且列印輸出到控制台
步驟
1.執行個體化File對象,指明要操作的檔案
2.提供具體的流
3.資料的讀取
4.關閉流
1.方法一
//為了保證流資源一定會關閉,是以要是用try-cath-finally
FileReader fileReader = null;
try {
//1.執行個體化File對象,指明要操作的檔案
//(此處用的是絕對路徑,我們也可以采用相對路徑,是相對于該項目的,例如: File file = new File("file.txt");)
File file = new File("D:\\IDEA_Project\\CodeGenerator\\src\\main\\resources\\file\\file.txt");
//執行個體化完file對象之後,千萬别忘記建立file真是的檔案,這樣file才真是存在!
//如果沒有建立則會報錯:
//Exception in thread "main" java.io.FileNotFoundException: hello.txt (系統找不到指定的檔案。)
file.createNewFile();
System.out.println(file.getAbsolutePath());//絕對路徑
//2.提供具體的流,把指定的檔案處理成節點流的形式在讀入到項目中
fileReader = new FileReader(file);
//執行到這裡,我們就可以看到項目中建立的新檔案了,我們下面對資料進行讀取
//因為我們是剛剛建立的檔案,沒有内容,是以請手動添加資訊,友善下面測試
//3.資料的讀取
//read()傳回讀入的字元,如果達到檔案尾部,傳回-1
//我們讀取的字元是char類型,例如:在記憶體中a代表97
int read = fileReader.read();
while (read != -1) {
System.out.print((char) read);//強轉成字元(char類型)
read = fileReader.read();//繼續讀取下一個字元
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileReader!=null) {
try {
fileReader.close();//關閉流
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.方式二.改造加強方法一
主要修改是步驟三(改造原因:方法一的缺點,每次讀取一個字元,輸出一個字元,需要進行多次的互動,效率太低,方法二采用一次多讀取幾個字元,放在數組中再輸出,輸出完之後再去進行互動,這樣減少了互動的次數,效率會有提升)
//3.資料的讀取
char[] charBuffers = new char[5];//每次會讀取5個(可以自定義讀取的個數,本例已5為例)
//read(charBuffers)傳回每次讀入charBuffers數組中字元的個數,如果達到檔案尾部,傳回-1
int len;//記錄每次讀取新元素的個數
while ((len=fileReader.read(charBuffers)) != -1) {//循環完之後再繼續讀取位元組流中的字元,知道全部讀取完,循環停止
for (int i = 0; i < len; i++) {
//***為什麼要i<len而不是i<charBuffers.length?
//因為:數組每次往裡面添加資料,是對數組之前裡的元素進行覆寫
//假設最後一次,我們讀取了三個字元,而我們的數組裡還存在上一次讀取的五個字元
//我們開始往數組裡添加這次的新資料,前三個覆寫完畢,後面兩個還是原本的數組,沒有字元覆寫
//這樣我們的輸出就會産生對于的錯誤資料!
System.out.print(charBuffers[i]);
}
}
@Test
void contextLoads() throws IOException {
FileReader fileReader = null;
try {
//1.執行個體化File對象,指明要操作的檔案
File file = new File("D:\\IDEA_Project\\CodeGenerator\\src\\main\\resources\\file\\file.txt");
file.createNewFile();
System.out.println(file.getAbsolutePath());//絕對路徑
//2.提供具體的節點流
fileReader = new FileReader(file);
//3.資料的讀取
//read(charBuffers)傳回每次讀入charBuffers數組中字元的個數,如果達到檔案尾部,傳回-1
char[] charBuffers = new char[5];//每次會讀取5個
int len;
while ((len=fileReader.read(charBuffers)) != -1) {
for (int i = 0; i < len; i++) {
System.out.println(charBuffers[i]);
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileReader!=null) {
try {
fileReader.close();//關閉流
} catch (IOException e) {
e.printStackTrace();
}
}
}
}