2012-03-05 46 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