【问题标题】:Chaining InputStream in Java在 Java 中链接 InputStream
【发布时间】:2015-08-16 02:07:20
【问题描述】:

所以我知道InputStream 将数据视为原始数据,Reader 将其视为字符。

缓冲它们会让事情变得更有效率。

但是像这样链接它们怎么样:

InputStream in = new InputStream(...);
in = new BufferedInputStream(in);
Reader r = new InputStreamReader(in);
r = new BufferedReader(r);

是这样吗?

【问题讨论】:

  • 鉴于BufferedReader 无论如何都会做缓冲,我怀疑使用BufferedInputStream 会有多大帮助......
  • 您可以无限期地添加越来越多的缓冲区。直到所有可用内存耗尽。
  • 另外,在创建 Reader 时始终指定字符编码。否则它变得依赖于环境。
  • InputStream in = new InputStream; 不会编译
  • This answer 解释什么时候缓冲是好的,什么时候缓冲只是开销。

标签: java inputstream bufferedreader


【解决方案1】:

Java 7中,下面是一个应用程序示例,它使用BufferedReaderInputStreamReader 结合BufferedInputStream 简单地读取一个4MB 的文件,并比较Java 下bout 技术的读取性能7.

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class MainIO_Optimization {

    public static void main(String[] args) {

        BufferedInputStream bis = null;
        InputStreamReader isr = null;
        BufferedReader br = null;

        try {

            // ------ 1 ------ 
            bis = new BufferedInputStream(new FileInputStream(new File("data/dictionnaire.txt")));
            isr = new InputStreamReader(bis);
            // ------ 2 ---------------
            br = new BufferedReader(new FileReader("data/dictionnaire.txt")); 

            char[] buf = new char[10];


            // ****** Performance  *****

            // we get system time 
            long startTime = System.currentTimeMillis();
            // we simply read
            while( br.read(buf) != -1 );
            // print the time of execution  
            System.out.println("Time reading using BufferedReader with FileReader : "+ (System.currentTimeMillis()-startTime) + " ms" );



            long startTime2 = System.currentTimeMillis();
            while( isr.read(buf) != -1 );
            System.out.println("Time reading using InputStreamReader with BufferedInputStream et FileInputStream : " + (System.currentTimeMillis() - startTime2 + " ms" ));


        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally{

            try {
                if(bis != null)
                    bis.close();
                if(isr != null)
                    isr.close();
                if(br != null)
                    br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }

}

结果

使用带有 FileReader 的 BufferedReader 读取时间:31 ms

使用带有 BufferedInputStream 和 FileInputStream 的 InputStreamReader 读取时间:32 毫秒

如您所见,结果相差 1 毫秒BufferedReader 更快。


Java 8 中,最好使用NIO 包而不是IO。所以FileChannels 会更有效率。

【讨论】:

  • 实际上我的问题是可以缓冲(使用 BufferReader)已经缓冲的内容(BufferedInputStream)吗?
  • 无论如何,不​​需要缓冲它已经缓冲的内容......你可以调整我的代码来检查双缓冲和单缓冲的性能:)
【解决方案2】:

这类问题已经回答了:https://stackoverflow.com/a/15799469/3480200

根据其他人的一些意见,我得出结论:

在我的情况下,在另一个缓冲中使用缓冲是不行的。没用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-27
    • 2018-05-02
    • 1970-01-01
    • 2020-04-30
    • 2013-08-04
    • 2021-07-22
    • 1970-01-01
    相关资源
    最近更新 更多