java 的io流需要学吗_Java的IO流之字节流,必须要学得内容,你会嘛?
原標(biāo)題:Java的IO流之字節(jié)流,必須要學(xué)得內(nèi)容,你會(huì)嘛?
伙伴們~
端午節(jié)過的如何呀~
有沒有很開心呀~
假期已過咱們繼續(xù)開動(dòng)了
IO流
先來認(rèn)識(shí)一下IO流:
IO流用來處理設(shè)備之間的數(shù)據(jù)傳輸,Java對(duì)數(shù)據(jù)的操作是通過流的方式,用于操作流的類都在IO包中。
1)流按流向分為兩種:
輸入流,輸出流。
2)流按操作類型分為兩種:
字節(jié)流 :
字節(jié)流可以操作任何數(shù)據(jù),因?yàn)樵谟?jì)算機(jī)中任何數(shù)據(jù)都是以字節(jié)的形式存儲(chǔ)的
字節(jié)流的抽象父類:
InputStream/OutputStream
字符流 :
字符流只能操作純字符數(shù)據(jù),比較方便。
字符流的抽象父類:
Reader/Writer
3)IO程序書寫規(guī)范
使用前,導(dǎo)入IO包中的類
使用時(shí),進(jìn)行IO異常處理
使用后,釋放資源
字節(jié)流
今天我們先來認(rèn)識(shí)一下字節(jié)流
1)FileInputStream
字節(jié)流的輸入,使用read()方法一次讀取一個(gè)字節(jié)
把文件 zzz.txt 中的字節(jié)讀取到控制臺(tái)上~因?yàn)閍、b、c等英文字符在底層是用 ASC 碼的數(shù)字表示的,所以我們在控制臺(tái)上讀取的結(jié)果是數(shù)字
注意:
read()方法的返回值是int
因?yàn)樽止?jié)輸入流可以操作任意類型的文件,比如圖片音頻等,這些文件底層都是以二進(jìn)制形式的存儲(chǔ)的。
如果每次讀取都返回 byte,有可能在讀到中間的時(shí)候遇到 {{111111111:0}}(byte類型的-1),read() 方法遇到 -1 就會(huì)停止不讀,后面的數(shù)據(jù)也就讀不到了,
所以在讀取的時(shí)候用 int 類型接收,像{{11111111:0}}會(huì)在其前面補(bǔ)上24個(gè)0,湊足4個(gè)字節(jié),那么 byte 類型的 -1就變成 int 類型的 255 了。這樣可以保證整個(gè)數(shù)據(jù)讀完,而結(jié)束標(biāo)記的-1就是 int 類型。
2)FileOutputStream
字節(jié)輸出流 write() 一次寫出一個(gè)字節(jié)
把字節(jié)寫入到文件 yyy.txt 中
注:
1)如果不存在 yyy.txt 這個(gè)文件,程序會(huì)自動(dòng)創(chuàng)建一個(gè) yyy.txt
2)因?yàn)樵趫?zhí)行 FileOutputStream() 方法的時(shí)候,會(huì)先把文件里面的內(nèi)容清空,然后再來把我們要寫的東西寫入~
如果我們想要不刪出文件里面的內(nèi)容而是追加內(nèi)容該如何做呢?
在FileOutputStream的構(gòu)造方法中,有一個(gè)構(gòu)造方法,存在一個(gè)appen參數(shù),表示追加的意思,我們在這邊設(shè)置一個(gè) true ,表示我們是追加內(nèi)容就可以了~
那么代碼應(yīng)該這樣寫~
字節(jié)流的拷貝
現(xiàn)在輸入輸出我們都掌握了,就可以搞事情了,我們來做一個(gè)拷貝圖片的練習(xí)吧~
1)逐個(gè)字節(jié)的拷貝方式
這樣就可以把圖片copy了一份了~
上面這種通過逐個(gè)字節(jié)拷貝文件的方式,對(duì)小一點(diǎn)的文件還好,當(dāng)對(duì)大一點(diǎn)文件進(jìn)行拷貝的時(shí)候速度就會(huì)慢下來——效率太低~(在實(shí)際的開發(fā)中我們不考慮)
2)利用available()拷貝方法
查看API有如下的介紹
大致意思就是,available()方法可以獲取到我們將要 copy 的文件的所有字節(jié)個(gè)數(shù)~這樣我們就可以一次性讀取需要copy的文件的數(shù)據(jù),然后在一次性的輸出出來~
但是這種方式也有一個(gè)弊端,比如我們想拷貝一個(gè)大一點(diǎn)的文件(像藍(lán)光電影這種有10+G大~),那么我們在拷貝之前就需要?jiǎng)?chuàng)建一個(gè)10+G大小的數(shù)組,要知道這些程序都是放在Java虛擬機(jī)中運(yùn)行的,而Java虛擬機(jī)是虛擬在計(jì)算機(jī)的內(nèi)存中(內(nèi)存也不會(huì)全給Java虛擬機(jī),一般Java的虛擬機(jī)也就100+M)就可能會(huì)導(dǎo)致內(nèi)存溢出~,所以一般也是不推薦的~
3)定義小數(shù)組拷貝方式
這個(gè)方法綜合了上面的兩種方式~
所以推薦這種方式來拷貝文件
4)利用緩沖思想進(jìn)行拷貝
字節(jié)流一次讀寫一個(gè)數(shù)組的速度明顯比一次讀寫一個(gè)字節(jié)的速度快很多,這是加入了數(shù)組這樣的緩沖區(qū)效果,java本身在設(shè)計(jì)的時(shí)候,也考慮到了這樣的設(shè)計(jì)思想,所以提供了字節(jié)緩沖區(qū)流
帶緩沖的拷貝
1)BufferedInputStream 內(nèi)置了一個(gè)緩沖區(qū)(數(shù)組),BufferedInputStream 會(huì)一次性從文件中讀取8*1024個(gè),存在緩沖區(qū)中,程序在讀取時(shí),就不用找文件了,直接從緩沖區(qū)中獲取,直到緩沖區(qū)中所有的數(shù)據(jù)都被讀取過,BufferedInputStream才重新從文件中讀取8*1024個(gè)。
2)BufferedOutputStream也內(nèi)置了一個(gè)緩沖區(qū)(數(shù)組),程序向流中寫出字節(jié)時(shí),不會(huì)直接寫到文件,先寫到緩沖區(qū)中,直到緩沖區(qū)寫滿,BufferedOutputStream 才會(huì)把緩沖區(qū)中的數(shù)據(jù)一次性寫到文件里。
那么小數(shù)組的讀寫和帶Buffered的讀取哪個(gè)更快?
定義小數(shù)組如果是8*1024個(gè)字節(jié)大小和B uffered 比較的話,定義小數(shù)組會(huì)略勝一籌,因?yàn)樽x和寫操作的是同一個(gè)數(shù)組,而Buffered操作的是兩個(gè)數(shù)組。
在緩沖中存在一個(gè) flush() 刷新方法,可以把緩沖區(qū)中的內(nèi)容輸出來~
flush() 和 close() 方法的區(qū)別
(偷個(gè)懶,就不寫代碼演示了)
flush()方法
用來刷新緩沖區(qū)的,刷新后可以再次寫出 。
close()方法
用來關(guān)閉流釋放資源的的,如果是帶緩沖區(qū)的流對(duì)象調(diào)用了 close() 方法,不但會(huì)關(guān)閉流,還會(huì)再關(guān)閉流之前刷新緩沖區(qū),關(guān)閉后不能再進(jìn)行寫出操作~
流的標(biāo)準(zhǔn)處理異常代碼
Java1.6版本及其以前的處理方式
try finally嵌套
原則就是當(dāng)程序出現(xiàn)問題時(shí),盡量把流關(guān)閉,不要占用資源~
Java 1.7的版本以后的寫法
原理
在 try() 中創(chuàng)建的流對(duì)象必須實(shí)現(xiàn)了 AutoCloseable 這個(gè)接口,實(shí)現(xiàn)了 AutoCloseable 接口以后 , 在 try 后面的大括號(hào) {}中的讀寫代碼執(zhí)行后,就會(huì)自動(dòng)調(diào)用流對(duì)象的 close 方法將流關(guān)掉~ 返回搜狐,查看更多
責(zé)任編輯:
總結(jié)
以上是生活随笔為你收集整理的java 的io流需要学吗_Java的IO流之字节流,必须要学得内容,你会嘛?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: M22“蝉”式空降坦克
- 下一篇: matlab 轴承 压力分布 绘图,数值