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 以上の非常に大きなバッファで read 関数を使用してみてください。次に、ファイルを 1.4 MB で合計 60 回読み取りますが、これは 1000 よりもはるかに少ないです。1000 の小さなバッファーを使用すると、約 1300 または 1000 よりもさらに遅いファイルを読み取ることになります ( readline ) . また、行は正確な行ではなく文字の配列であるため、印刷中には println の代わりに print を使用します。

于 2013-11-01T00:23:44.463 に答える
0

よくわかりませんが、PHPは使用した方法でファイルを出力するだけだと思います。Javaはファイルを読み取り、そこからすべての行を取得します。つまり、すべての文字で改行をチェックします。プロセスは同じではないようです全て。

string file_get_contents

PHP でファイルから各行を 1 行ずつ印刷しようとすると、遅くなるはずです。

于 2013-05-29T07:32:44.923 に答える
0

そのコードの 8 秒は、私には長すぎるように思えます。正直なところ、何か他のことが起こっていると思います。時間がかかっているのはコンソール出力ではありませんか?

System.nanoTime最後に合計時間を書き出すことをお勧めしますが、コンソールを最小化して実行してください。そうすれば、十分に速いことがわかると思います。

于 2013-05-29T07:36:29.780 に答える