Java - 从文件中读取.输入流与读者

Jer*_*emy 14 java text inputstream

在我看到的从文件中读取的每个Java实现中,我几乎总是看到用于逐行读取的文件读取器.我的想法是,这将是非常低效的,因为它需要每行系统调用.

我一直在做的是使用输入流并直接获取字节.在我的实验中,这明显更快.我的测试是一个1MB的文件.

    //Stream method
    try {
        Long startTime = new Date().getTime();

        InputStream is = new FileInputStream("test");
        byte[] b = new byte[is.available()];
        is.read(b);
        String text = new String(b);
        //System.out.println(text);

        Long endTime = new Date().getTime();
        System.out.println("Text length: " + text.length() + ", Total time: " + (endTime - startTime));

    }
    catch (Exception e) {
        e.printStackTrace();
    }

    //Reader method
    try {
        Long startTime = new Date().getTime();

        BufferedReader br = new BufferedReader(new FileReader("test"));
        String line = null;
        StringBuilder sb = new StringBuilder();
        while ((line = br.readLine()) != null) {
            sb.append(line);
            sb.append("\n");
        }
        String text = sb.toString();

        Long endTime = new Date().getTime();
        System.out.println("Text length: " + text.length() + ", Total time: " + (endTime - startTime));

    }
    catch (Exception e) {
        e.printStackTrace();
    }
Run Code Online (Sandbox Code Playgroud)

这给出了以下结果:

Text length: 1054631, Total time: 9
Text length: 1034099, Total time: 22
Run Code Online (Sandbox Code Playgroud)

那么,为什么人们使用读者而不是流?

如果我有一个方法接受一个文本文件并返回一个包含所有文本的字符串,那么使用流做它是否更好?

Con*_*Del 9

你正在比较苹果和香蕉.即使使用bufferedReader,一次读取一行也会降低效率,而不是尽可能快地抓取数据.请注意,不鼓励使用可用,因为它在所有情况下都不准确.当我开始使用密码流时,我发现了这一点.

  • @Jeremy"可用"的问题是它只能返回可用的字节数*而不会​​阻塞*.如果你100%确定你的`InputStream`的缓冲区包含你的整个文件,你的`InputStream`将从`available`返回正确的数字,那么一定要使用它.但是如果你的文件大于`InputStream的缓冲区或你的`InputStream`没有返回正确的数字,使用它将失败. (5认同)