3

我正在尝试读取一个包含大约 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";
    }
?>

请赐教这个问题

4

6 回答 6

0

file_get_contents 将所有文件内容加载到一个字符串中,您的 Java 代码正在逐行读取和打印。如果您在 Eclipse 之类的 IDE 中进行测试,控制台输出可能会很慢。如果你想要 file_get_contents 的确切行为,你可以使用这个脏代码:

 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()));
于 2013-05-29T07:46:30.407 回答
0

好吧,如果您使用 readline,它将为每行读取文件 1000 次。尝试使用具有非常大缓冲区的读取功能,例如超过 28000 左右。然后它将读取一个文件,说总共 60 次 1.4 MB 远小于 1000。如果您使用 1000 的小缓冲区,那么它将读取大约 1300 或什至比 1000 慢的文件(readline) . 此外,在打印行时,请使用 print 而不是 println,因为这些行并不完全是行,而是一个字符数组。

于 2013-11-01T00:23:44.463 回答
0

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

string file_get_contents

如果您尝试使用 PHP 从文件中逐行打印,它应该会更慢。

于 2013-05-29T07:32:44.923 回答
0

该代码的 8 秒对我来说听起来太长了。老实说,我怀疑发生了其他事情。您确定不是控制台输出需要很长时间吗?

我建议您System.nanoTime在最后写出总时间(例如,用 )计时,但在最小化控制台的情况下运行它。我怀疑你会发现它足够快。

于 2013-05-29T07:36:29.780 回答
0

那不只是控制台输出很慢吗?既然您知道您的文件已正确读取,请尝试注释掉该行System.out.println(line);

于 2013-05-29T07:40:47.063 回答
-1

阅读器通常很慢,您应该尝试快速的流阅读器。并确保文件打开过程不需要时间。如果打开文件并创建流对象然后测量时间,那么您可以确切地确定这是由于文件打开问题或读取文件问题。确保在此操作时系统 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));
 }
于 2013-05-29T10:57:13.380 回答