簡述
IO流指的就是內存到硬盤的路徑,從硬盤到內存我們稱為輸入流,從內存到硬盤我們稱為輸出流。根據數據的類型我們還可以把IO流分為字節流和字符流,一個字符等於2個字節。
一個中文在GBK中占兩個字節,在UTF-8中占三個字節,所以我們用字節的輸入輸出流讀取/寫入中文時,會有些困難
所以java提供一些字符流類,以字符為單位讀寫數據,專門用於處理文本文件。
任意的文本編輯器,在打開文件的時候,都會查詢編碼表,將字節轉化為字符表示
如果在0到127范圍就會查詢ASCII碼表,如果是其他值就會查詢系統默認編碼表,UTF-8三個字節是一個中文,GBK兩個字節是一個中文
windows系統的換行符是\r\n,linux系統的換行符是/n,mac是/r
字節輸出流OutputStream
這是一個抽象類,表示所有字節輸出流的超類。
輸出流的本質就是在指定路徑創建一個空的文件,然后對此空文件進行操作。
close() 關閉輸出流
flush() 刷新此輸出流
write(byte[] b)將b.length字節從指定的byte數組寫入此輸出流
常用子類FileOutputStream
簡述
FileOutputStream是文件字節輸出流,繼承OutputStream,作用是把內存中的數據寫入到硬盤的文件中。
構造方法:
FileOutputStream(File file) 創建一個向指定File對象表示的文件中寫入數據的文件輸出流
FileOutputStream(String name) 創建一個向指定文件名稱表示的文件中寫入數據的文件輸出流
FileOutputStream(File file,boolean append) append表示是否追加數據
FileOutputStream(String name,boolean append) append表示是否追加數據
若使用下面兩個構造函數,則創建對象時不會創建空文件,而是繼續在末尾追加數據
字節輸入流InputStream
read() 讀取輸入流數據的下一個字節,讀取到文件的末尾就返回-1
read(byte[] b) 從輸入流中讀取一定量的字節,將其存儲到緩沖區數組b中
close() 關閉資源
常用子類FileInputStream
簡述
FileInputStream是文件字節輸入流,繼承InputStream,作用是把硬盤中的數據讀入到內存中
構造方法
FileInputStream(File file)
FileInputStream(String name)
字符輸入流Reader
Reader表示用於讀取字符流的所有類的超類,可以讀取字符信息到內存中
void close() 關閉此字符流
int read() 從輸入流中讀取一個字節
int read(char[] buf) 從輸入流中讀取一些字符,並將它們存儲到字符串數組buf中
常用子類FileReader
簡述
讀取文件的字符輸入流,該類繼承InputStreamReader,InputStreamReader繼承Reader
作用是把硬盤文件中的數據以字符的方式讀入內存中
構造方法
FileReader(File file)
FileReader(String name)
字符輸出流Writer
Writer是字符輸出流的超類
close() 關閉此流
write(char[] cbuf) 寫入字符數組
write(char[] cbuf,int off,int len) 寫入字符數組的某一部分
write(int c) 寫入單個字符
write(String str) 寫入單個字符串
write(String str,int off ,int len) 寫入字符串的某一部分
常用子類FileWriter
簡述
輸出文件的字符輸出流,該類繼承OutputStreamWriter,OutputStreamWriter繼承Write
注意字符輸出流的write是將數據寫入內存的緩沖區中(字符轉化為字節的過程)
需要調用flush或者關閉資源才會將數據從緩沖區刷到硬盤
作用是把內存中的數據以字符的方式輸出到硬盤中
構造方法
FileWriter(File file)
FileWriter(String name)
FileWriter(File file,boolean append)
FileWriter(String name,boolean append)
流的異常處理
在jdk1.7之后,可以在try后增加一個小括號,在括號內可以定義流對象,那么這個流對象的作用域就在try中有效,try中的代碼執行完畢時會自動地把流對象釋放,這樣做可以簡化IO流的異常處理
try(FileInputStream fileInputStream = new FileInputStream("c:\\1.jpg"); FileOutputStream fileOutputStream = new FileOutputStream("d:\\1.jpg"); ){ byte[] bytes = new byte[1024]; int len = 0; while((len = fileInputStream.read(bytes))!=-1){ fileOutputStream.write(bytes,0,len);//寫bytes的有效區間 } }catch (IOException e){ e.printStackTrace(); }