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