Java 使用BufferedReader.readLine()读取文本文件太慢

Java 使用BufferedReader.readLine()读取文本文件太慢,java,php,io,Java,Php,Io,我正在尝试读取一个包含大约1000行非常长的文本文件。整个文件大约有1.4MB。 我正在使用BufferedReader的readLine方法来读取文件。在控制台上打印输出需要8-10秒。我用php的fgets做了同样的尝试,它一眨眼就能打印出所有相同的行!!!怎么可能呢? 下面是我正在使用的代码 import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundException;

我正在尝试读取一个包含大约1000行非常长的文本文件。整个文件大约有1.4MB。 我正在使用BufferedReader的readLine方法来读取文件。在控制台上打印输出需要8-10秒。我用php的fgets做了同样的尝试,它一眨眼就能打印出所有相同的行!!!怎么可能呢? 下面是我正在使用的代码

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ClickLogDataImporter {
    public static void main(String [] args) {
        try {
            new ClickLogDataImporter().getFileData();
        } catch (Exception ex) {
            Logger.getLogger(ClickLogDataImporter.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void getFileData() throws FileNotFoundException, IOException {
        String path = "/home/shantanu/Documents";
        BufferedReader br = new BufferedReader(new InputStreamReader(
                new FileInputStream(path+"/sample.txt")));
        String line = "";
        while((line = (br.readLine())) != null) {
            System.out.println(line);
        }

    }
}
PHP代码

<?php
    $fileName = "/home/shantanu/Documents/sample.txt";
    $file = fopen($fileName, 'r');
    while(($line = fgets($file)) != false) {
        echo $line."\n";
    }
?>


请告诉我这个问题

我不确定,但我认为PHP只是打印文件,根据您使用的方法,Java读取文件并从中获取每一行,这意味着检查每个字符是否有换行符,过程似乎完全不同

string file_get_contents

如果您尝试用PHP逐个打印文件中的每一行,速度应该会慢一些。

8秒的时间对我来说太长了。老实说,我怀疑发生了什么事。您确定不是控制台输出占用了很长时间吗


我建议你在最后写下总的时间来计时(例如,用),但要用最小化的控制台来运行它。我想你会发现它已经足够快了。

这不正是控制台的输出速度慢吗?现在您知道您的文件已正确读取,请尝试注释掉行
System.out.println(行)

file\u get\u contents将所有文件内容加载到一个字符串中,使用Java代码逐行读取和打印。 如果您在像Eclipse这样的IDE中进行测试,控制台输出可能会非常慢。 如果您想了解文件内容的确切行为,可以使用以下脏代码:

 File f = new File(path, "sample.txt");
 ByteArrayOutputStream bos = new ByteArrayOutputStream(new Long(Math.min(Integer.MAX_VALUE, f.length())).intValue());
 FileInputStream fis = new FileInputStream(f);
 byte[] buf = new byte[1024 * 8];
 int size;
 while((size = fis.read(buf)) > 0) {
    bos.write(buf, 0, size);
 }
 fis.close();
 bos.close();
 System.out.println(new String(bos.toByteArray()));

读卡器通常速度较慢,您应该尝试速度较快的流式读卡器。并确保文件打开过程不会花费时间。如果打开了文件并创建了流对象,然后测量时间,那么您可以准确地确定这是由于文件打开问题或读取文件问题造成的。确保执行此操作时系统io负载不高,否则测量结果将变差

 BufferedInputStream reader=new BufferedInputStream(new FileInputStream("/home/shantanu/Documents/sample.txt"));
 byte[] line=new byte[1024];
 while(reader.read(line)>0) {
 System.out.println(new String(line));
 }

如果您使用readline,它将为每行读取文件1000次。试着用一个非常大的缓冲区(比如超过28000个缓冲区)来使用read函数。然后,它将读取一个文件,即1.4MB的总读取次数为60次,远远小于1000次。如果你使用1000的小缓冲区,那么它将读取1300左右的文件,或者比1000(readline)还要慢的文件。另外,在打印行时,使用print而不是println,因为行不是精确的行,而是一个字符数组。

两个代码都是在控制台上打印行。php还在打@Shades88:也许出于某种原因,PHP具有更快的控制台访问速度。我很怀疑阅读这份文件是否花时间。这很容易测试。如果你去掉了Java中的控制台输出,只需计算一下你读到的行数,然后在最后写出这些行数,需要多长时间?我进行了同样的测试。注释控制台输出,java需要80-90毫秒,而php只需要3-5毫秒@Shades88:我猜这取决于操作系统缓存。。。和JIT编译。您可能会发现,如果您多次运行该方法,速度会非常快。这个程序实际上代表了您要做的任何事情,还是您只是想比较PHP和Java的速度?如果是这样,在我看来,这不是一个非常有用的比较。请检查编辑的代码。正如DJon正确解释的那样,我在做两个无与伦比的过程。逐行阅读和放弃全部内容是两码事。因此,我执行了另一个测试,现在使用FGET。结果仍然是sameI assue,两个程序都以相同的方式运行,也是从命令行运行的?是的,都在命令行上确定,那么,从哪一刻开始测量时间?我在代码中看不到这一点。所以问题可能出在JRE加载时间上,而不是代码的执行时间上。java大约需要80-90毫秒,php不超过5毫秒!我仔细检查了一下。但它是soPlease检查编辑的代码。现在我在php中使用fgets。所以一行一行地读。结果:您不是从浏览器或shell使用PHP吗?然后,它必须是您的控制台输出,删除
System.out.printl(line)
,然后查看需要多长时间。我正在从shell运行这两个命令。如果您可以提供示例文件,或者告诉我们命令行的大小和数量,我可以测试这两种方法,并告诉你我是否有相同的结果。共有1000行,每行至少有1000个字符。这仍然在做同样的工作——将二进制数据转换为文本数据——只是在不同的点上。此外,建议对文本数据使用
InputStream
,从根本上说是个坏主意。例如,您的代码可能最终读取字符的一部分(例如,使用UTF-8的两字节字符的第一个字节),而您永远不会知道。此外,您的代码不使用返回值
read
,因此您正在使用整个缓冲区创建一个字符串,不管它是否充满有用的数据。