【问题标题】:Performance of DataInputStream\DataOutputStreamDataInputStream\DataOutputStream 的性能
【发布时间】:2012-03-23 00:12:55
【问题描述】:

我目前正在使用缓冲流来读写一些文件。在这之间,我做了一些数学处理,其中符号是一个字节。

阅读:

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)
                       )

【问题讨论】:

    标签: java performance io buffering


    【解决方案1】:

    您应该在两者之间添加BufferedOutputStreamDataOutputStream 没有实现任何缓存(这很好:关注点分离),如果不缓存底层OutputStream,它的性能会很差。即使是像writeInt() 这样最简单的方法也可能导致四个单独的磁盘写入。

    据我所知,只有 write(byte[], int, int)writeUTF(String) 正在将数据写入一个 byte[] 块中。其他人则逐字节写入原始值(如intdouble)。

    【讨论】:

    • 这完全帮助了我的一天。谢谢你^^
    【解决方案2】:

    您绝对需要中间的 BufferedOutputStream。

    感谢您对性能的关注,我有 2 条建议:

    1. 使用 java 压缩来缩小流。有用的文章可以在here找到。
    2. 使用组合而不是继承(无论如何都是推荐的做法)。创建一个包含相互连接的 PipedInputStream 和 PipedOutputStream 的管道,使用 getInputStream() 和 getOutputStream() 方法。您不能直接将 Pipe 对象传递给需要流的对象,但可以将它的返回值传递给 get方法。

    【讨论】:

    • 谢谢。根据我的任务要求,我不能压缩强硬
    • GZip*Stream 在 java 中有很大的问题,因为它通过本机调用使用了大量内存。 LZ-4 可能更好。
    猜你喜欢
    • 2013-03-12
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 2018-03-09
    • 2017-12-31
    • 2014-06-04
    相关资源
    最近更新 更多