位元組流與字元流,位元組流和字元流的使用哪個多? 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(newFileInputStream(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。