天天看點

IO輸入流 1----從指定的檔案中讀取資料到項目中

**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();
                }
            }
        }

    }