3

私はJavaの初心者で、〜25 MBのファイルを読み込んでいます.ロードするのに永遠に時間がかかります...これを高速化するための代替手段はありますか? 大きなファイルを処理できないのはスキャナーですか?

String text = "";
Scanner sc = new Scanner(new File("text.txt"));
while(sc.hasNext()) {
text += sc.next();
}
4

3 に答える 3

8

反復ごとにテキストに連結しており、文字列は Java では不変です。つまり、「変更」さStringれるたびにメモリ内に新しいオブジェクトが作成されるため、大きなファイルの読み込み時間が長くなります。aを継続的に変更する場合は、常にa を試して使用するtext必要があります。StringBuilderString

あなたがすることができます:

StringBuilder text = new StringBuilder();
Scanner sc = new Scanner(new File("text.txt");
while(sc.hasNext()) {
  text.append(sc.next());
}

テキストの内容にアクセスしたい場合は、 を呼び出すことができますtext.toString()

于 2013-08-06T06:44:44.427 に答える
4

それは、String +=常に成長し続ける新しい String オブジェクトを作成する です。実際、25 MB 未満の場合は次のことができます (undermore):

StringBuilder sb = new StringBuilder();
BufferReader in = new BufferedReader(new InputStreamReader(
    new FileInputStream(new File("text.txt"), "UTF-8")));
for (;;) {
    String line = in.readLine();
    if (line == null)
        break;
    sb.append(line).append("\n");
}
in.close();
String text = sb.toString();

readLine改行文字を含まず、改行文字までの行を生成します。

Java 7 では、次のことができます。

Path path = Paths.get("text.txt");
String text = new String(Files.readAllBytes(path), "UTF-8");

エンコーディングは UTF-8 として明示的に指定されます。「Windows-1252」は、Windows Latin-1 などの場合です。

于 2013-08-06T06:45:45.323 に答える
1

を使用してみてください。BufferedStreamsたとえば、BufferedInputStream, BufferedReader加速します。詳細についてBufferedStreamsは、こちらをご覧ください。 http://docs.oracle.com/javase/tutorial/essential/io/buffers.html

s は で不変であるため、String使用する代わりに、ループの各反復内で新しいを作成しますStringBuilderStringJavaStringwhile

于 2013-08-06T06:44:16.743 に答える