1. 程式人生 > >位元組流與字元流,位元組流和字元流的使用哪個多? java 讀寫操作大檔案 BufferedReader和RandomAccessFile

位元組流與字元流,位元組流和字元流的使用哪個多? java 讀寫操作大檔案 BufferedReader和RandomAccessFile

首先我們要知道

在程式中所有的資料都是以流的方式進行傳輸或儲存的

 

而流有兩種

位元組流用來處理位元組或二進位制物件

字元流主要用來處理字元或字串,一個字元佔兩個位元組

而上一篇的java 讀寫操作大檔案 BufferedReader和RandomAccessFile

BufferedReader正是處理字元流,RandomAccessFile則是處理位元組流

 

兩類都分為輸入和輸出操作。

在位元組流中輸出資料主要是使用OutputStream完成,輸入使的是InputStream

在字元流中輸出主要是使用Writer類完成,輸入流主要使用Reader類完成

 

 

位元組流在操作的時候本身是不會用到緩衝區(記憶體)的,是與檔案本身直接操作的,而字元流在操作的時候是使用到緩衝區的

 

位元組流在操作檔案時,即使不關閉資源(close方法),檔案也能輸出,但是如果字元流不使用close方法的話,則不會輸出任何內容,說明字元流用的是緩衝區,並且可以使用flush方法強制進行重新整理緩衝區,這時才能在不close的情況下輸出內容

 


 

這裡再說一個面試的坑,位元組流和字元流的使用哪個多?

沒過腦子的時候,我說了buffer的字元流,畢竟加快處理,節約硬碟io。從效能上說一定是好的用的多了。

 

 

但是正如開頭所說,在程式中所有的資料都是以流的方式進行傳輸或儲存的所以使用位元組的操作是最多的

 

從上一篇的操作中可以看出,想要用buffer,你還是要先取位元組流,再轉成字元流 orz

 

 

//RandomAccessFile操作大資料檔案
FileChannel channel = new RandomAccessFile(input_path, "r").getChannel(); //BufferedReader操作大資料檔案 BufferedInputStream bis = new BufferedInputStream(new
FileInputStream(new File(input_path))); int bufferSize = 10 * 1024 * 1024; BufferedReader in = new BufferedReader(new InputStreamReader(bis, "utf-8"), bufferSize);

 

 

當然我的程式碼做不得準,看一下java原始碼。FileReader的構造器就是FileInputStream,也就是位元組流。只是操作的時候用了buffer變成了字元流而已。

    public FileReader(String fileName) throws FileNotFoundException {
        super(new FileInputStream(fileName));
    }

這算是一個很細的坑,不管有沒有了解位元組流字元流,都會踩一次啊。

 

那麼,看了原始碼之後,我們總算明白為什麼大多數io操作,我們都不直接使用字元流的操作,而是取出位元組流,把位元組流變成我們希望的樣子,才用字元流操作吧?

因為,java的預設字元流操作,並不一定適用於我們的需求,所以程式設計師需要diy。