java處理檔案的類裡面,stream結尾都是採用位元組流,reader和writer結尾都是採用字元流。兩者的區別就是讀寫的時候一個是按位元組讀寫,一個是按字元。
字元流的底層就是位元組流。而字元流主要是讀取文字檔內容的,可以一個字元一個字元的讀取,也可以一行一行的讀取文字檔內容。而位元組流讀取單位為byte.byte作為電腦儲存最基本單位,可以用位元組流來讀取很多其他格式的檔案,比片視頻等等。基於B/S和C/S的檔案傳輸都可以採用位元組流的形式。在讀寫檔案需要對內容按行處理,比如比較特定字元,處理某一行資料的時候一般會選擇字元流。只是讀寫檔案,和檔案內容無關的,一般選擇位元組流。 (註:除了字元和位元組流之外,java還有一種叫物件流程。有興趣可以去查API學習一下。)
位元組流就是按照位元組來進行傳輸,字元流是按照字元來傳輸.最基本的是位元組流,字元流可以說是對位元組流的一個封裝流.比如你知道了一個字元是8個位元組,那麼你讓位元組流一次傳輸8個位元組,那不就相當於一次傳輸一個字元,也就是字元流了。
位元組流與和字元流的使用非常相似,兩者除了作業碼上的不同之外,是否還有其他的不同呢?
實際上位元組流在操作時本身不會用到緩衝區(記憶體),是檔案本身直接操作的,而字元流在操作時使用了緩衝區,通過緩衝區再操作檔案,
下面以兩個寫檔案的操作為主進行比較,但是在操作時位元組流和字元流的操作完成之後都不關閉輸出資料流。
範例:使用位元組流不關閉執行
// 通過位元組流 寫檔案public static void ByteWrite() { File file = new File("d:\\test\\test.txt"); try { OutputStream outputStream = new FileOutputStream(file); String textString = "Hello World!!!"; byte[] data = textString.getBytes(); outputStream.write(data); //outputStream.close(); } catch (IOException e) { System.out.println("位元組流寫入檔案出錯。"); e.printStackTrace(); }}
複製代碼
程式運行結果:
此時沒有關閉位元組流操作,但是檔案中也依然存在了輸出的內容,證明位元組流是直接操作檔案本身的。而下面繼續使用字元流完成,再觀察效果。
範例:使用字元流不關閉執行
// 通過字元流 寫檔案public static void StringWrite() { File file = new File("d:\\test\\test.txt"); try { FileWriter writer = new FileWriter(file); String textString = "Hello World!!!"; writer.write(textString); // writer.flush(); // writer.close(); } catch (IOException e) { System.out.println("字元流寫入檔案出錯."); e.printStackTrace(); }}
複製代碼
程式運行結果:
程式運行後會發現檔案中沒有任何內容,這是因為字元流操作時使用了緩衝區,而 在關閉字元流時會強制性地將緩衝區中的內容進行輸出,但是如果程式沒有關閉,則緩衝區中的內容是無法輸出的,所以得出結論:字元流使用了緩衝區,而位元組流沒有使用緩衝區。
提問:什麼叫緩衝區?
在很多地方都碰到緩衝區這個名詞,那麼到底什麼是緩衝區?又有什麼作用呢?
回答:緩衝區可以簡單地理解為一段記憶體地區。
可以簡單地把緩衝區理解為一段特殊的記憶體。
某些情況下,如果一個程式頻繁地操作一個資源(如檔案或資料庫),則效能會很低,此時為了提升效能,就可以將一部分資料暫時讀入到記憶體的一塊地區之中,以後直接從此地區中讀取資料即可,因為讀取記憶體速度會比較快,這樣可以提升程式的效能。
在字元流的操作中,所有的字元都是在記憶體中形成的,在輸出前會將所有的內容暫時儲存在記憶體之中,所以使用了緩衝區暫存資料。
如果想在不關閉時也可以將字元流的內容全部輸出,則可以使用Writer類中的flush()方法完成。
提問:使用位元組流好還是字元流好?
學習完位元組流和字元流的基本操作後,已經大概地明白了操作流程的各個區別,那麼在開發中是使用位元組流好還是字元流好呢?
回答:使用位元組流更好。
在回答之前,先為讀者講解這樣的一個概念,所有的檔案在硬碟或在傳輸時都是以位元組的方式進行的,包括圖片等都是按位元組的方式儲存的,而字元是只有在記憶體中才會形成,所以在開發中,位元組流使用較為廣泛。
位元組流與字元流主要的區別是他們的的處理方式
流分類: 1.Java的位元組流 InputStream是所有位元組輸入資料流的祖先,而OutputStream是所有位元組輸出資料流的祖先。 2.Java的字元流 Reader是所有讀取字串輸入資料流的祖先,而writer是所有輸出字串的祖先。 InputStream,OutputStream,Reader,writer都是抽象類別。所以不能直接new
位元組流是最基本的,所有的InputStream和OutputStream的子類都是,主要用在處理位元據,它是按位元組來處理的 但實際中很多的資料是文本,又提出了字元流的概念,它是按虛擬機器的encode來處理,也就是要進行字元集的轉化 這兩個之間通過 InputStreamReader,OutputStreamWriter來關聯,實際上是通過byte[]和String來關聯 在實際開發中出現的漢字問題實際上都是在字元流和位元組流之間轉化不統一而造成的
在從位元組流轉化為字元流時,實際上就是byte[]轉化為String時, public String(byte bytes[], String charsetName) 有一個關鍵的參數字元集編碼,通常我們都省略了,那系統就用作業系統的lang 而在字元流轉化為位元組流時,實際上是String轉化為byte[]時, byte[] String.getBytes(String charsetName) 也是一樣的道理
至於java.io中還出現了許多其他的流,按主要是為了提高效能和使用方便, 如BufferedInputStream,PipedInputStream等