# Java IO ``` Java IO -> InputStream -> ByteArrayInputStream -> FileInputStream -> FilterInputStream -> BufferedInputStream -> DataInputStream -> OutputStream -> ByteArrayOutputStream -> FileOutputStream -> FilterOutputStream -> BufferedOutStream -> DataOutputStream -> PrintStream -> Reader -> BufferedReader -> Writer -> BufferedWriter ``` IO 即為Input/Output, 流入/流出 Stream: 我們把一組有序的資料稱為串流。 並且Java把Stream分成兩種: - Byte Stream: InputStream/OutputStream 不分任何類型,純的數據流。 - Char Stream: Reader/Writer (Unicode, 任何char都占用2bytes) 按照解碼/編碼的不同,有不同的方法。 ## InputStream: - ``int read()`` 讀取下一個byte (0~255) 如果未讀取到資料 -> return -1 - ``int read(byte b[])`` = ``read(b,0,b.length());`` - ``int read(byte b[], int off, int len)`` 讀取最多len個byte,從``b[off]``開始存到``b[off+len]`` 回傳讀取的byte數, 如果未讀取到資料 -> return -1 - ``int available()`` 回傳inputStream中可讀取的byte數 - ``close()`` 關閉,釋放資源 - ``byte[] readAllBytes()`` 讀取所有bytes ### FileInputStream 讀取檔案: ```java= FileInputStream fileInputStream = new FileInputStream(".gitignore"); int i; while ((i = fileInputStream.read()) != -1) { System.out.println((char) i); } ``` ### DataInputStream 必須配合其他InputStream使用: ```java= FileInputStream fileInputStream = new FileInputStream(".gitignore"); DataInputStream dataInputStream = new DataInputStream(fileInputStream); dataInputStream.readInt(); dataInputStream.readUTF(); ... ``` ## OutputStream - ``void write(int b)`` 寫入byte - ``int write(byte b[])`` = ``write(b,0,b.length());`` - ``int write(byte b[], int off, int len)`` 把``b[off]``到``b[off+len]``寫入 回傳寫入的byte數, 如果未讀取到資料 -> return -1 - ``void flush()`` 刷新,並且強制寫出 - ``close()`` 關閉,釋放資源 ### FileOutputStream 寫入檔案: ```java= FileOutputStream fileOutputStream = new FileOutputStream(".gitignore"); byte[] data = "Hello World".getBytes(); fileOutputStream.write(data); ``` ### DataOutputStream 必須配合其他OutputStream使用: ```java= FileOutputStream fileOutputStream = new FileOutputStream(".gitignore"); DataOutputStream dataOutputStream = new DataOutputStream(fileOutputStream); dataOutputStream.writeInt(300); ``` ## Reader - ``int read()`` - ``int read(char[] cbuf)`` - ``int read(char[] cbuf, int off, int len)`` - ``int skip(long n)`` - ``close()`` ### InputStreamReader 用於把InputStream轉為Reader ### FileReader 繼承自InputStreamReader ```java= FileReader fileReader = new FileReader(".gitignore"); int i; while ((i = fileReader.read()) != -1) { System.out.print((char) i); } ``` ## Writer - ``write(int c)`` - ``write(char[] cbuf)`` - ``write(char[] cbuf, int off, int len)`` - ``write(String str)`` - ``write(String str,int off, int len)`` - ``Writer append(CharSequence c)`` - ``Writer append(char c)`` - ``flush()`` - ``close()`` ### OutStreamWriter 用於把OutStream轉為Writer ### FileWriter 繼承自OutStreamWriter ```java= FileWriter fileWriter = new FileWriter(".gitignore"); fileWriter.write("Hello"); ``` ## BufferedStream/Reader 緩衝流, 把資料先存到buffer,一次性I/O較多資料以提升效率。 範例: - BufferedInputStream ```java= FileInputStream fileInputStream = new FileInputStream(".gitignore"); BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream); int i; while ((i = bufferedInputStream.read()) != -1) { System.out.print((char) i); } ``` - BufferedReader ```java= FileReader fileReader = new FileReader(".gitignore"); BufferedReader bufferedReader = new BufferedReader(fileReader); int i; while ((i = bufferedReader.read()) != -1) { System.out.print((char) i); } ``` - BufferedOutputStream ```java= FileOutputStream fileOutputStream = new FileOutputStream(".gitignore") BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream); byte[] data = "Hello".getBytes(); bufferedOutputStream.write(data); ``` - BufferedWriter ```java= FileWriter fileWriter = new FileWriter(".gitignore"); BufferedWriter bufferedWriter = new BufferedWriter(fileWriter); bufferedWriter.write("Hello"); bufferedWriter.close(); ``` ## ``System.in`` , ``System.out`` System.in實際上是一個InputStream物件 假設我們想要從Standard Stream讀取資料: ```java= InputStreamReader r = new InputStreamReader(System.in); //BufferedReader reader = new BufferedReader(r); ``` System.out也是一個PrintStream, 如果需要做Logger可以對該PrintStream操作。