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原始檔的,包括以後要學的其他程式語言的原始檔都可以用字元流讀取)