Java IO流-基本流
IO流 基本流
IO流:存儲(chǔ)和讀取數(shù)據(jù)的解決方案
作用:讀寫數(shù)據(jù)(本地文件,網(wǎng)絡(luò))
按流的方向分:IO流分為輸入流(讀取)和輸出流(寫出)
按操作文件類型分:字節(jié)流(操作所有類型的文件)和字符流(只能操作純文本文件)
純文本文件:Windows自帶的記事本打開能讀懂 word文件,Excel文件不是純文本文件
IO流體系
字節(jié)流:InputStream(字節(jié)輸入流)和OutputStream(字節(jié)輸出流)
字符流:Reader(字符輸入流)和Writer(字符輸出流)
上述均為抽象類
字節(jié)流
FileOutputStream
細(xì)節(jié)
創(chuàng)建字節(jié)輸出流對(duì)象
參數(shù)使字符串表示的路徑或者是File對(duì)象均可
如果文件不存在會(huì)創(chuàng)建一個(gè)新的文件,但要保證父級(jí)路徑是存在的
如果文件已經(jīng)存在會(huì)清空文件
寫數(shù)據(jù)
write方法的參數(shù)是整數(shù),但是實(shí)際上寫到本地文件中的整數(shù)是在ASCII上對(duì)應(yīng)的字符
97->a
釋放資源
每次使用完流后要釋放資源
寫數(shù)據(jù)的三種方式

換行寫:
windows:\r\n
Linux:\n
Mac:\r
細(xì)節(jié):
在Windows操作系統(tǒng)中,java對(duì)回車換行進(jìn)行了優(yōu)化
雖然完整的是\r\n,但是我們寫其中一個(gè)\r或者\(yùn)n,java也可以實(shí)現(xiàn)換行,因?yàn)樗鼤?huì)在底層補(bǔ)全
建議:不要省略,還是寫全比較好
續(xù)寫:
如果想續(xù)寫打開開關(guān)即可,傳遞true
FileInputStream
如果讀不到了返回-1
書寫細(xì)節(jié):
創(chuàng)建字節(jié)輸入流對(duì)象
如果文件不存在就直接報(bào)錯(cuò)
讀取數(shù)據(jù)
一次讀一個(gè)字節(jié)讀出來(lái)的數(shù)據(jù)是在ASCII上對(duì)應(yīng)的數(shù)字,空格為32
讀到文件末尾了read方法返回-1
釋放資源
先開的流最后關(guān)閉
注意:read讀取一個(gè)數(shù)據(jù)移動(dòng)一次指針,所以要注意拿一個(gè)變量接受fis.read()結(jié)果
一次讀取多個(gè)字節(jié):

一般創(chuàng)建1024的整數(shù)倍的數(shù)組
捕獲異常
JDK7中捕獲異常的寫法
JDK9中捕獲異常的寫法
實(shí)際開發(fā)中,異常都是拋出處理,上述了解即可
字符集
計(jì)算機(jī)中,任意數(shù)據(jù)都是以二進(jìn)制形式存儲(chǔ)的,8位為1個(gè)字節(jié),存儲(chǔ)英文,一個(gè)字節(jié)就足以
GB2312字符集:1980年發(fā)布,1981年5月1日實(shí)施的簡(jiǎn)體中文漢字編碼國(guó)家標(biāo)準(zhǔn),收錄7445個(gè)圖形字符,包含6763個(gè)簡(jiǎn)體漢字(臺(tái)灣用不了)
BIG5字符:太短地區(qū)繁體中文標(biāo)準(zhǔn)字符集,共收錄13053個(gè)中文字,1984年實(shí)施
GBK字符集(國(guó)標(biāo)擴(kuò)):2000年3月17日發(fā)布,收錄21003個(gè)漢字,包含國(guó)家標(biāo)準(zhǔn)GB13000-1中的全部中日韓漢字和BIG5編碼中的所有漢字Windows系統(tǒng)默認(rèn)使用的就是GBK,不過(guò)系統(tǒng)顯示為ANSI
Unicode字符集:國(guó)際標(biāo)準(zhǔn)字符集,它將世界各種語(yǔ)言的每個(gè)字符定義唯一的編碼,以滿足跨語(yǔ)言,跨平臺(tái)的文本信息轉(zhuǎn)換
GBK完全兼容ASCII,英文用一個(gè)字節(jié)存儲(chǔ),漢字用兩個(gè)字節(jié)存儲(chǔ) 高位字節(jié)二進(jìn)制一定以1開頭,轉(zhuǎn)成十進(jìn)制后是一個(gè)負(fù)數(shù)(為了與英文區(qū)分開)
UFT-16編碼規(guī)則:用2-4個(gè)字節(jié)保存 UTF-32編碼規(guī)則:固定使用4個(gè)字節(jié)保存UTF-8編碼規(guī)則:用1-4個(gè)字符保存英文字母1個(gè)字節(jié),簡(jiǎn)體中文3個(gè)字節(jié)
UTF-8不是一個(gè)字符集!!!而是一個(gè)編碼規(guī)則,Unicode才是字符集
亂碼出現(xiàn)原因
字節(jié)流一次只讀取一個(gè)字節(jié),所以例如三個(gè)字節(jié)的漢字會(huì)被截?cái)?每一段都是負(fù)數(shù),而在ASCII表中沒(méi)有負(fù)數(shù)
編碼和解碼方式不統(tǒng)一
所以不要用字節(jié)流讀取文本文件,但是用字節(jié)流拷貝文本文件不會(huì)亂碼
編碼與解碼
Java中的編碼方法

Java中的解碼方法

字符流
字符流的底層就是字節(jié)流
字符流=字節(jié)流+字符集
特點(diǎn):
輸入流:一次讀一個(gè)字節(jié),遇到中文時(shí),一次讀多個(gè)字節(jié)
輸出流:底層會(huì)把數(shù)據(jù)按照指定的編碼方式進(jìn)行編碼,變成字節(jié)再寫到文件中
使用場(chǎng)景:對(duì)純文本文件進(jìn)行讀寫操作
FileReader
創(chuàng)建字符輸入流對(duì)象

如果文件不存在直接報(bào)錯(cuò)
讀取數(shù)據(jù)

細(xì)節(jié)1:按字節(jié)進(jìn)行讀取,讀到中文一次讀多個(gè)字節(jié),讀取后解碼返回一個(gè)整數(shù)
細(xì)節(jié)2:讀到文件末尾了,read方法返回-1
釋放資源

不帶參數(shù)的read方法:
read()細(xì)節(jié):
read()默認(rèn)也是一個(gè)字節(jié)一個(gè)字節(jié)地讀取的,如果遇到中文就會(huì)一次讀取多個(gè)
在讀取之后,方法的底層還會(huì)進(jìn)行解碼并轉(zhuǎn)成十進(jìn)制 最終把這個(gè)十進(jìn)制作為返回值 這個(gè)十進(jìn)制的數(shù)據(jù)也表示在字符集上的數(shù)字 英文:文件里面二進(jìn)制數(shù)據(jù) 0110 0001 read方法進(jìn)行讀取,解碼并轉(zhuǎn)為十進(jìn)制97 中文:文件里面的二進(jìn)制數(shù)據(jù)11100110 10110001 100010001 read方法進(jìn)行讀取,解碼并轉(zhuǎn)成十進(jìn)制27721 我想看到中文漢字,就是把這些十進(jìn)制數(shù)據(jù)再進(jìn)行強(qiáng)轉(zhuǎn)(char)就行了
帶參數(shù)的read方法:
read(chars):讀取數(shù)據(jù),解碼,強(qiáng)轉(zhuǎn)三步合并了,把強(qiáng)轉(zhuǎn)之后的字符放到數(shù)組當(dāng)中
read(chars)可以看做空參的read+強(qiáng)制類型轉(zhuǎn)換
FileWriter

創(chuàng)建字符輸出流對(duì)象
參數(shù)是字符串表示的路徑或者File對(duì)象都可以
如果文件不存在會(huì)創(chuàng)建一個(gè)新的文件,但要保證父級(jí)路徑存在
如果文件已存在則會(huì)清空文件,如果不想清空可以打開續(xù)寫開關(guān)
寫數(shù)據(jù)
如果write方法的參數(shù)是整數(shù),但是實(shí)際上寫到本地文件中的是整數(shù)在字符集上對(duì)應(yīng)的字符
釋放資源
字符流底層原理
創(chuàng)建字符流輸入對(duì)象
底層:關(guān)聯(lián)文件,并創(chuàng)建緩沖區(qū)(長(zhǎng)度為8192的字節(jié)數(shù)組)
讀取數(shù)據(jù)
底層:
判斷緩沖區(qū)中是否有數(shù)據(jù)可以讀取
如果緩沖區(qū)中沒(méi)有數(shù)據(jù),就從文件中獲取數(shù)據(jù)撞到緩沖區(qū)中,如果文件中也沒(méi)有數(shù)據(jù)了,返回-1
緩沖區(qū)有數(shù)據(jù)就從緩沖區(qū)中讀取 空參的read方法:一次讀取一個(gè)字節(jié),遇到中文一次讀多個(gè)字節(jié),把字節(jié)解碼并轉(zhuǎn)成十進(jìn)制返回 有參的read方法:把讀取字節(jié),解碼,強(qiáng)轉(zhuǎn)三步合并了,強(qiáng)轉(zhuǎn)之后的字符放到數(shù)組中

flush刷新:刷新之后,還可以繼續(xù)往文件中寫出數(shù)據(jù)
close關(guān)流:斷開通道,無(wú)法再往文件中寫出數(shù)據(jù)