天天看點

java之IO概述及位元組流

1.IO的引入

java之IO概述及位元組流

2.IO流的分類

  流向:

    輸入流  讀取資料

    輸出流  寫出資料

  資料類型:

    位元組流

      位元組輸入流  讀取資料  InputStream

      位元組輸出流  寫出資料  OutputStream

    字元流

      字元輸入流  讀取資料  Reader

      字元輸出流  寫出資料  Writer

我們一般在探讨IO流的時候,如果沒有明确說明按照那種分類來說,預設情況下是按照資料類型來分的。

3.寫入資料

4.實作資料的追加寫入

5.加入異常處理的位元組輸出流操作

6.讀取資料

改進版

7.複制檔案

不過這種方式每次都是讀取一個位元組,效率太慢了,如果讀取大的檔案,這種方式就不适合。

看到這裡很多人都崩潰了,為什麼這麼寫呢?哈哈,且聽老夫來分解代碼?

如果我a.txt檔案中的内容是

hello

world

java

那麼我們按照下面的代碼來執行

結果是這樣的

hello5

--------------

wor5

ld

j5

ava

j3

why?

其實a.txt的内容是下面這樣的啊

hello\r\n

world\r\n

java\r

我們是不是定義byte[] b = new byte[5];

第一次

hello 長度是5

第二次

\r\nwor 長度也是5 

其實第二次相當于

b[0]=\r

b[1]=\n

b[2]=w

b[3]=o

b[4]=r

當然這些字元的底層會轉換為byte的,不用擔心啊,我這樣寫隻是為了讓各位了解

第三次

ld\r\nj 長度也是5

b[0]=l

b[1]=d

b[2]=\r

b[3]=\n

b[4]=j

第四次

ava\rj 長度也是5 是不是不了解啦

第三次的是不是這樣的

但是這次其實隻有ava,那麼數組中是不是這樣排列?

b[0]=a

b[1]=v

b[2]=a

那麼第4,第5個元素呢,當然是第三次的,因為這一次是沒有字元去指派的。

懂了沒?

但是我們如何避免這種情況呢?

看上面的len,就是每次讀取的位元組長度。5,5,5,3

那麼,我們的代碼改成下面的樣子,是不是可以避免上面的問題呢?

ava3

此時,輸出的就是我們想要的啦。

java之IO概述及位元組流

那麼現在看懂下面的代碼嗎?

8.位元組緩沖流

  位元組流一次讀寫一個數組的速度明顯比一次讀寫一個位元組的速度快很多哦,這是加入數組這樣的緩沖效果,java本身在設計的時候,也考慮到了這樣的設計思想(裝飾模式),是以提供了位元組緩沖區流

位元組緩沖輸出流

BufferedOutputStream

位元組緩沖輸入流

BufferedInputStream