概念
* IO流失用來處理設(shè)備之間的數(shù)據(jù)傳輸
* java對數(shù)據(jù)的操作都是通過流的方式,操作流的類都放在IO包
* 分類
1.字節(jié)流:
操作任何數(shù)據(jù),因為在計算機(jī)中任何數(shù)據(jù)都是以字節(jié)的形式存儲的
* 抽象父類:InputStream(輸入),OutputStream(輸出)
* 子類:
(1)FileInputStream:從文件中獲取輸入字節(jié)。媒體文件
BufferedInputStream:帶有緩沖區(qū)的字節(jié)輸入流
(2)FileOutStream:文件輸出流堕油,將數(shù)據(jù)寫入文件
BufferedOutputStream:帶有緩沖區(qū)的字節(jié)輸出流
PrintStream:打印流,作為輸出打印
2.字符流:
只能操作純字符數(shù)據(jù),比較方便
* 抽象父類:Reader(輸入),Writer(輸出)
* 子類:
(1)FileReader:讀取字符文件的便捷類拇涤。
BufferedReader:將字符存入緩沖區(qū),再讀取
InputStreamReader:轉(zhuǎn)換流誉结,字節(jié)流和字符流的橋梁鹅士,多在編碼的地方使用
(2)FileWriter:寫入字符文件的便捷類。
BufferedWriter:將字符存入緩沖區(qū)惩坑,再寫入
OutputStreamWriter:轉(zhuǎn)換流掉盅,字節(jié)流和字符流的橋梁,多在編碼的地方使用
* 注:
(1)FileReader是使用默認(rèn)碼表讀取文件, 如果需要使用指定碼表讀取,
那么可以使用InputStreamReader(字節(jié)流,編碼表)
(2)FileWriter是使用默認(rèn)碼表寫出文件, 如果需要使用指定碼表寫出,
那么可以使用OutputStreamWriter(字節(jié)流,編碼表)
3.是否提高效率:用BufferedXXX
將流讀/寫到緩沖區(qū)以舒,緩沖區(qū)在內(nèi)存里趾痘,相較磁盤的讀寫效率高很多
方法
* int read():一次讀取一個字節(jié)/字符數(shù)組
* write():一次寫出一個字節(jié)/字符數(shù)組
* available()獲取讀的文件所有的字節(jié)個數(shù)
* close()關(guān)流釋放資源的的,如果是帶緩沖區(qū)的流對象的close()方法,
不但會關(guān)閉流,還會再關(guān)閉流之前刷新緩沖區(qū),關(guān)閉后不能再寫出
* flush()用來刷新緩沖區(qū)的,刷新后可以再次寫出
常見問題
- (read()方法返回值為什么是int)
read()方法讀取的是一個字節(jié),為什么返回是int,而不是byte
因為字節(jié)輸入流可以操作任意類型的文件,比如圖片音頻等,
這些文件底層都是以二進(jìn)制形式的存儲的,如果每次讀取都返回byte,
有可能在讀到中間的時候遇到111111111
那么這11111111是byte類型的-1,我們的程序是遇到-1就會停止不讀了,
后面的數(shù)據(jù)就讀不到了,所以在讀取的時候用int類型接收,
如果11111111會在其前面補上24個0湊足4個字節(jié),那么byte類型的-1就變成int類型的255了
這樣可以保證整個數(shù)據(jù)讀完,而結(jié)束標(biāo)記的-1就是int類型