在Java中链接InputStream

时间:2015-06-02 10:22:36

标签: java inputstream bufferedreader

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

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

但是如何将它们链接起来:

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

这是对的吗?

2 个答案:

答案 0 :(得分:1)

Java 7 中,以下是使用BufferedReaderInputStreamReader组合到BufferedInputStream简单读取文件4MB的应用程序示例,并比较其性能阅读Java 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 ms

如您所见,结果 1 ms 差异。 BufferedReader更快。

Java 8 中,您最好使用NIO个包而不是IO。因此FileChannels会更有效率。

答案 1 :(得分:0)

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

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

在我的情况下使用另一个缓冲的缓冲内容是不行的。它毫无用处。