1. 程式人生 > >IO流第三課Reader和FileReader

IO流第三課Reader和FileReader

  上節課我們學了位元組輸入流InputStream,這節課來學學位元組輸入流Reader

 

public abstract class Reader implements Readable, Closeable

可以看到Reader是一個抽象類,實現了Readable和Closeable介面

來看看Readable介面

 

public interface Readable {

    public int read(java.nio.CharBuffer cb) throws IOException;

}

 

這個Readable裡面只有一個方法read,但是引數沒見過,這個是NIO的內容,以後講。

 

接下來來看看Reader都有哪些構造器:

凡是介紹裡有同步兩個字的暫時不管,這個是執行緒的內容,以後講。

 

所以我們可以看到Reader有一個無參構造器

 

常用方法:

常用的有close read skip,ready有時候也用,不過我沒怎麼用過。

read(CharBuffer target)那個不用管,NIO的內容

 

接下來看看具體使用:

首先看看FileReader

public class FileReader extends InputStreamReader

 

然後看InputStreamReader

 

public class InputStreamReader extends Reader

由此可見FileReader是Reader的子類

 

然後看看構造器:

和FileInputStream類似,常用的就第一個和第三個

 

常用方法:

 

接下來來看看InputStreamReader的常用方法

 

 

 

接下來是程式碼演示,通過FileReader來讀取檔案內容

 

public class ReaderTeach {



    public static void main(String[] args) {

        Reader reader = null;

        try {

            File file = new File("F:\\code\\java\\123.txt");

            reader = new FileReader(file);



            int a = 0;

            String content = "";

            do {

                a = reader.read();

                content += (char)a;

            }while (a != -1);



            System.out.println(content);

        } catch (FileNotFoundException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        } finally {

            try {

                reader.close();

            } catch (IOException e) {

                e.printStackTrace();

            }

        }

    }

}

 

輸出:

123456?

 

可以看到這樣讀取的話最後會出現亂碼,所以我一般通過位元組流讀,當然不是說字元流不好,字元流可以讀取固定長度的字元,比如

 

public static void main(String[] args) {

    Reader reader = null;

    try {

        File file = new File("F:\\code\\java\\123.txt");

        reader = new FileReader(file);



        char[] charContent = new char[3];

        reader.read(charContent);

        String content = new String(charContent);

        System.out.println(content);



    } catch (FileNotFoundException e) {

        e.printStackTrace();

    } catch (IOException e) {

        e.printStackTrace();

    } finally {

        try {

            reader.close();

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

}

 

輸出:

123

 

我們來輸出下 檔案大小吧

 

可以看到檔案大小為6,我們完全可以像FileInputStream那樣來讀取:

 

public static void main(String[] args) {

    Reader reader = null;

    try {

        File file = new File("F:\\code\\java\\123.txt");

        reader = new FileReader(file);



        char[] charContent = new char[(int)file.length()];

        reader.read(charContent);

        String content = new String(charContent);

        System.out.println(content);



    } catch (FileNotFoundException e) {

        e.printStackTrace();

    } catch (IOException e) {

        e.printStackTrace();

    } finally {

        try {

            reader.close();

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

}

 

這樣也是可以的,但如果檔案是位元組碼檔案就沒法這樣讀了,比如.CLASS檔案或者圖片、音訊、視訊之類的檔案就只能通過位元組流來讀取,字元流是以字元為單位,所以只能讀取文字檔案(注意,程式碼即文字,所以字元流是可以讀java原始檔的,包括以後要學的其他程式語言的原始檔都可以用字元流讀取)