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

时间:2013-05-29 07:28:40

标签: java php io

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

请告诉我这个问题

6 个答案:

答案 0 :(得分:0)

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

string file_get_contents

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

file_get_contents将所有文件内容加载到String中,您正在阅读并逐行打印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()));

答案 4 :(得分:0)

如果您使用readline,那么它将为每行读取文件1000次。尝试使用读取功能,使用非常大的缓冲区,超过28000左右。然后它将读取一个文件,总共60次,1.4 MB,远小于1000.如果你使用1000的小缓冲区,那么它将读取1300左右的文件或甚至比1000慢的东西(readline) 。同时打印线条时使用print而不是println,因为线条不是精确的线条而是字符数组。

答案 5 :(得分:-1)

读者通常很慢,你应该尝试快速的Stream阅读器。并确保FIlE开放过程不花时间。如果打开文件并创建流对象然后测量时间,那么您可以确切地知道它是由于文件打开问题或读取文件问题。确保在此操作时系统负载不高,否则测量将变坏。

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