1. 程式人生 > 其它 >JavaIO流之FileReader與FileWriter

JavaIO流之FileReader與FileWriter

一、流的分類:

  1. 操作資料單位:位元組流、字元流
  2. 資料的流向:輸入流、輸出流
  3. 流的角色:節點流、處理流

二、流的體系結構

抽象基類
InputStream
OutputStream
Reader
Writer

節點流(或檔案流)
FileInputStream (read(byte[] buffer))
FileOutputSteam (write(byte[] buffer,0,len))
FileReader (read(char[] cbuf))
FileWriter (write(char[] cbuf,0,len))

緩衝流(處理流的一種)
BufferedInputStream (read(byte[] buffer))
BufferedOutputStream (write(byte[] buffer,0,len)) / flush()
BufferedReader (read(char[] cbuf) / readLine())
BufferedWriter (write(char[] cbuf,0,len)) / flush()

三、FileReader的使用

使用FileReader將當前module下的hello.txt檔案內容讀入程式中,並輸出到控制檯。
說明點:

  1. read()的理解:返回讀入的一個字元。如果達到檔案末尾,返回-1
  2. 異常的處理:為了保證流資源一定可以執行關閉操作,需要使用try-catch-finally處理
  3. 讀入的檔案一定要存在,否則就會報FileNotFoundException。
    測試程式碼:
    @Test
    public void testFileReader() {
        FileReader fr = null;
        try {
            //1.例項化File類的物件,指明要操作的檔案
            File file = new File("hello.txt");
            //2.提供具體的流
            fr = new FileReader(file);
            //3.資料的讀入
            //read():返回讀入的一個字元。如果達到檔案末尾,返回-1
            int data;
            while ((data = fr.read())!= -1){
                System.out.print((char)data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4.流的關閉操作
            try {
                if (fr != null)
                    fr.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    //對read()操作升級:使用read的過載方法
    @Test
    public void testFileReader1(){
        FileReader fr = null;
        try {
            //1.File類的例項化
            File file = new File("hello.txt");
            //2.FileReader流的例項化
            fr = new FileReader(file);
            //3.讀入的操作
            //read(char[] cbuf):返回每次讀入cbuf陣列中的字元的個數。如果達到檔案末尾,返回-1
            char[] cbuf = new char[5];
            int len;
            while ((len = fr.read(cbuf)) != -1){
                //方式一:
                //錯誤寫法
//                for (int i = 0; i < cbuf.length; i++) {
//                    System.out.print(cbuf[i]);
//                }
                //正確寫法
//                for (int i = 0; i < len; i++) {
//                    System.out.print(cbuf[i]);
//                }
                //方式二:
                //錯誤寫法:對應著方式一的錯誤寫法
//                String str = new String(cbuf);
//                System.out.print(str);
                //正確寫法
                String str = new String(cbuf, 0, len);
                System.out.print(str);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4.資源的關閉
            if (fr != null) {
                try {
                    fr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

四、FileWriter的使用

從記憶體中寫出資料到硬碟的檔案裡
說明:
輸出操作,對應的File可以不存在的。並不會報異常
File對應的硬碟中的檔案如果不存在,在輸出的過程中,會自動建立此檔案。
File對應的硬碟中的檔案如果存在:

  • 如果流使用的構造器是:FileWriter(file,false) / FileWriter(file):對原有檔案的覆蓋
  • 如果流使用的構造器是:FileWriter(file,true):不會對原有檔案覆蓋,而是在原有檔案基礎上追加內容
    測試程式碼:
    @Test
    public void testFileWriter() {
        FileWriter fw = null;
        try {
            //1.提供File類的物件,指明寫出到的檔案
            File file = new File("hello1.txt");
            //2.提供FileWriter的物件,用於資料的寫出
            fw = new FileWriter(file);
            //3.寫出的操作
            fw.write("I have a dream!\n");
            fw.write("You need to have a dream!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fw != null) {
                //4.流資源的關閉
                try {
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

五、FileReader和FileWriter的測試

使用FileReader和FileWriter來實現文字檔案的讀入和寫出操作(相當於複製該檔案)
測試程式碼:

    @Test
    public void testFRFW() {
        FileReader fr = null;
        FileWriter fw = null;
        try {
            //1.建立File類物件,指明讀入和寫出的檔案
            File srcFile = new File("hello.txt");
            File destFile = new File("hello2.txt");
            //2.建立輸入流和輸出流的物件
            fr = new FileReader(srcFile);
            fw = new FileWriter(destFile);
            //3.資料的讀入和寫出操作
            char[] cbuf = new char[5];
            int len;
            while ((len = fr.read(cbuf)) != -1){
                fw.write(cbuf,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4.關閉流資源
            try {
                if (fr != null)
                    fr.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (fw != null)
                    fw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }