java - Java 中的链接输入流

标签 java inputstream bufferedreader

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

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

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

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

这是正确的吗?

最佳答案

Java 7 中,以下是一个应用程序示例,它使用 BufferedReaderInputStreamReader 组合到 BufferedInputStream 来读取 4MB 的文件并比较Java 7下bout技术的读取性能。

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();
            }

        }
    }

}

结果

Time reading using BufferedReader with FileReader : 31 ms

Time reading using InputStreamReader with BufferedInputStream et FileInputStream : 32 ms

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

<小时/>

Java 8中,您最好使用NIO包而不是IO。因此FileChannels将会更加高效。

关于java - Java 中的链接输入流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30593418/

相关文章:

java - Prevayler 的同步策略是什么?

java - org.springframework.http.converter.HttpMessageNotReadableException 调用休息后调用时

java - 从 .txt 文件中获取特定文本

java - Java 引用书目程序

java - BufferedReader 永远不会关闭。有何影响?

java - Spring - 以编程方式将接口(interface)绑定(bind)到实现类

java - 如何将 3D 点转换为 2D 透视投影?

inputstream - 最佳做法是将文件读取为InputStream

java - 基于SSLSockets java应用的认证

java - 在InputStream和FileInputStream之间切换的简单方法?