分類
1.按數(shù)據(jù)流向
- 輸入流
- 輸出流
- 按數(shù)據(jù)類型
- 字節(jié)流
- 字符流
IO流常用基類
- 字節(jié)流的抽象基類:InputStream,OutputStream
- 字符流的抽象基類:Reader,Writer
這四個類的子類都以他們?yōu)槊纸Y(jié)尾
由于他們都是抽象的類,無法實例化,因此需要尋找他們的子類
FileOutputStream 寫入/輸出數(shù)據(jù)字節(jié)流
構造方法
FileOutputStream(File file) 參數(shù)為File類型的對象
FileOutputStream(File file,boolean append) 參數(shù)為File類型的對象,若append為true,則在文件末尾繼續(xù)寫
FileOutputStream(String name) 參數(shù)為路徑
寫入數(shù)據(jù)
-步驟:1. 創(chuàng)建流對象 2. 寫數(shù)據(jù) 3.釋放資源
public void write(byte[] b) 將字節(jié)數(shù)組寫入文件
public void write(byte[] b, int off, int len) 將字節(jié)數(shù)組的一部分寫入文件,從off開始,寫len個
public void write(int b) 寫一個字節(jié),根據(jù)編碼表找到對應字符,如97對應a
實現(xiàn)換行
write("\n".getBytes()); 寫入換行符 “\n” 的字節(jié)
注意:可能通過某些軟件打開會發(fā)現(xiàn)沒有換行,是因為不同操作系統(tǒng)的換行符不同,但高級記事本軟件可以識別任意換行符
異常處理
標準寫法
FileOutputStream fos = null;
try {
fos = new FileOutputStream("fos2");
fos.write("Java".getBytes());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(fos!=null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
FileInputStream 字節(jié)流讀入數(shù)據(jù)
構造方法
FileInputStream(File file) 參數(shù)為File類型的對象
FileInputStream(String name) 參數(shù)為路徑
讀入數(shù)據(jù)
public int read() 從該輸入流讀取一個字節(jié)的數(shù)據(jù),如果返回是-1,則讀完了
public int read(byte[] b) 一次讀一個字節(jié)數(shù)組的數(shù)據(jù),返回讀到的字節(jié)個數(shù)
計算機如何識別中文?
在計算機中,中文占兩個字節(jié),第一個字節(jié)一定是負數(shù)
自帶數(shù)組的IO流
BufferedOutputStream 自帶緩沖區(qū)的流,BufferedInputStream 自帶緩沖區(qū)的流
構造函數(shù)
public BufferedInputStream(InputStream in) 創(chuàng)造默認大小的流
public BufferedInputStream(InputStream in,int size) 創(chuàng)建指定大小的流
public BufferedOutputStream(OutputStream out) 創(chuàng)造默認大小的流
public BufferedOutputStream(OutputStream out,int size) 創(chuàng)建指定大小的流
為什么要傳遞一個流對象,而不傳遞一個具體的文件或文件路徑呢?
此流僅僅提供緩沖區(qū),真正讀寫還需要基本的流對象實現(xiàn)
OutputStreamWriter 寫入/輸出數(shù)據(jù)字符流,從字節(jié)流到字符流的橋
構造函數(shù)
public OutputStreamWriter (OutputStream out) 參數(shù)為OutputStream 對象,可以用子類對象入FileOutputStream
public OutputStreamWriter (OutputStream out,String charsetName) charsetName 為編碼名稱
方法
public void write(int c) 寫一個字符
public void write(char[] cbuf) 寫一個字符數(shù)組
public void write(char[] cbuf,int odd,int len) 寫一個字符數(shù)組的一部分
public void write(String str ) 寫一個字符串
public void write(String str,int odd,int len) 寫一個字符串的一部分
public void flush() 刷新
InputStreamReader 讀取數(shù)據(jù)字符流,從字節(jié)流到字符流的橋
構造函數(shù)
public InputStreamReader (InputStream in) 參數(shù)為InputStream 對象,可以用子類對象入FileInputStream
public InputStreamReader (InputStream in,String charsetName) charsetName 為編碼名稱
方法
public int read(int c) 讀一個字符,沒讀到返回-1
public int read(char[] chs) 讀一個字符數(shù)組,結(jié)果在chs數(shù)組中,返回讀到的長度,沒讀到返回-1
FileWriter 和FileReader
在使用本地默認編碼表時,使用這兩個字符流的類
FileWriter 繼承 OutputStreamWriter ,F(xiàn)ileReader 繼承 InputStreamReader ,使用方法如上
字符緩沖流BufferedWriter和BufferedReader
特殊功能
BufferedWriter : public void newLine() 產(chǎn)生一個新的行
BufferedReader : public String readLine() 一次讀取一行,將讀到的內(nèi)容以String 返回,若沒有讀到,返回null