2012-03-05 42 views
5

我目前使用緩衝流讀取寫入一些文件。在我之間做一些數學處理,其中一個符號是一個字節。DataInputStream DataOutputStream的性能

閱讀:

InputStream input = new FileInputStream(outputname) 
input.read(byte[] b,int off,int len) 

這樣寫:

OutputStream output = new BufferedOutputStream(
          new FileOutputStream(outputname), 
          OUTPUTBUFFERSIZE 
         ) 
output.write((byte)byteinsideaint); 

現在我需要添加一些報頭數據,並且也支持短符號。我想使用DataInputStreamDataOutputStream來避免將其他類型轉換爲字節,我想知道它們的性能如何。

我需要使用

OutputStream output = new DataOutputStream(
          new BufferedOutputStream(
            new FileOutputStream(outputname), 
            OUTPUTBUFFERSIZE 
          ) 
         ); 

,以保持數據緩衝的優勢,或者是不夠好,使用

OutputStream output = new DataOutputStream(
          new FileOutputStream(outputname) 
         ) 

回答

7

你應該之間添加BufferedOutputStreamDataOutputStream沒有實現任何緩存(這很好:關注點分離),如果不緩存底層的OutputStream,它的性能會很差。即使最簡單的方法(如writeInt())也會導致四次單獨的磁盤寫入。

據我所見只有write(byte[], int, int)writeUTF(String)正在寫入數據在一個byte[]塊。其他人以字節爲單位寫入原始值(如intdouble)。

+0

這完全有助於我的一天。謝謝^^ – Lake 2016-03-03 15:36:34

1

你絕對需要中間的BufferedOutputStream。

我很欣賞你對性能的關注,我有2點建議:

  1. 收縮你的流用java壓縮。有用的文章可以發現here
  2. 使用組合而不是繼承(無論如何,這是推薦的做法)。使用getInputStream()和getOutputStream()方法創建一個包含PipedInputStream和PipedOutputStream的管道。您不能將Pipe對象直接傳遞給需要流的東西,但可以傳遞它的返回值get方法來做到這一點。
+0

謝謝。根據我的任務的要求,我不能壓縮艱難 – UmNyobe 2012-03-05 14:30:12

+0

GZip * Stream在java中有巨大的問題,但是,因爲它通過本地調用使用大量內存。 LZ-4可能更好。 – claj 2014-02-26 14:53:17