2

重複の可能性:
ファイルの内容から Java 文字列を作成する方法

を使用しBufferedReaderて大きなテキスト ファイルを読み取っていますが、リーダーが読み取った内容全体を に保存したいと考えていますStringStringを印刷すると、ファイルの最後の部分だけを取得したように見えるため、これは正しく機能していないようです。ここで何か間違ったことをしていますか?

try {
    String str = "";
    BufferedReader fileReader = new BufferedReader(new FileReader(args[2]));
    while (fileReader.ready()) {
        str += (char) fileReader.read();
    }
    System.out.println(str);
} catch (IOException e) {
    e.printStackTrace();
}
4

5 に答える 5

2

ここで何か間違ったことをしていますか?

まあ、間違っていることもあれば、理想からかけ離れていることもあります。

  • BufferedReaderという型の変数がありますfileReader。控えめに言っても紛らわしいです。
  • プラットフォームのデフォルトのエンコーディングを常に使用するFileReaderため、これは一般的に悪い考えです。
  • あなたは return の間だけ読んでいready()ますtrue。これは、次の読み取りがブロックされるかどうかを返すだけです。ファイルには問題ないかもしれませんが、一般的には良い考えではありません。次の呼び出しでストリームが使い果たされたことを示すまで読む必要があります。
  • read一度に文字を読み取っていますが、これはやや非効率的です。文字配列を取るオーバーロードを使用するのではなく、文字ごとに 1 つの呼び出しを行う必要がなく、一括転送が可能です。
  • ファイルを構築するために文字列連結を使用していますが、これも非常に非効率的です。
  • リーダーを閉じているという兆候はありません。多分それはあなたが投稿していないコードにあります...
  • try明確な理由もなく2 レベルのブロックがあり、そのIOException処理はほとんどの場合間違ったアプローチです。(ログ記録後であっても) 例外をめったに飲み込まず、何も起こらなかったかのように続行する必要があります。

可能であれば、このコードを完全に記述することは避けてください。代わりにGuavaを使用してください。

// Use the appropriate encoding for the file, of course.
String text = Files.toString(new File(args[2]), Charsets.UTF_8);

もちろん、まだ同じ結果が表示されることに気付くかもしれません。ファイルに"\r"改行があり、それを「行頭に戻る」とのみ解釈するシステムを使用しているため、各行が前の行を上書きしている可能性があります。 1。それを正確に判断することはできませんが、コードを への 1 回の呼び出しに置き換えると、Files.toString()診断が容易になります。

于 2012-10-10T21:52:52.613 に答える
2

あなたの問題は while 条件です。ready は使用しないでください。ところで、String をStringBufferに置き換えてください。コードははるかに高速に実行されます。

このコードを試してください(テストされていませんが、動作するはずです)

StringBuffer sb = new StringBuffer();

try {
    fileReader = new BufferedReader(new FileReader(args[2]));
    int i;
    while ((i=fileReader.read())!=-1) {
            sb.append(s);
    }

    System.out.println(sb.toString());

 } catch (IOException e) {
        e.printStackTrace();
 }

これは readLine を使用したバージョンです (改行が気になる場合は、\n を追加できます)

StringBuffer sb = new StringBuffer();

try {
    fileReader = new BufferedReader(new FileReader(args[2]));
    String s;
    while ((s=fileReader.readLine())!=null) {
            sb.append(s);
            //sb.append('\n'); //if you want the newline
    }

    System.out.println(sb.toString());

 } catch (IOException e) {
        e.printStackTrace();
 }
于 2012-10-10T21:59:57.260 に答える
1

commons ioutils の IOUtils.toString メソッドの 1 つを使用することもできます。

于 2012-10-11T00:38:34.283 に答える
0

Java 7 を使用Files.readAllLinesしている場合は、これを 1 行で行うために使用します。

そうしないと、あなたの方法は非常に非効率的です。ここの回答のいずれかを使用してくださいファイルの内容から Java 文字列を作成するにはどうすればよいですか?

于 2012-10-10T21:51:34.660 に答える
0

これがテキスト ファイルの場合は、なぜ ? を使用しないのですreadLine()か?

于 2012-10-10T21:51:38.060 に答える