0

テキスト ファイルに書かれた内容を使用するより複雑なプログラムがありますが、まったく機能せず、何も表示されず、すべてがファイルに依存しています。文字列をコード内の何かと等しくして、ファイルからの読み取りを取り除くと、機能します。読み取った行を表示するのと同じくらい簡単なことを試しましたが、実行しても何も表示されません。

編集:ファイルへのパスが見つかりません...通常、デフォルトのファイルはどこにありますか? ファイルはプログラムと同じディレクトリにありますが、見つからないのはなぜですか?

public static void main(String[] args) {
    String s;
        try {
            FileReader fstream=new FileReader("input.txt");
            BufferedReader in=new BufferedReader(fstream);

        while((s=in.readLine())!=null){
        System.out.print(s);


        }}catch(IOException e){
            System.exit(0);
        }
    }
}
4

4 に答える 4

3

例外を無視しないでください。何も読み取られない場合は、おそらく例外がスローされています。バブルを起こして何が悪いのかを伝える代わりに、それをキャッチして静かに終了します。これは、火災報知機を購入して音量を 0 に設定するようなものです。火災が発生したことは決してわかりません。

プログラムを次のように変換します

public static void main(String[] args) throws IOException {
    String s;
    FileReader fstream=new FileReader("input.txt");
    BufferedReader in=new BufferedReader(fstream);

    while((s=in.readLine()) != null) {
        System.out.print(s);
    }
}

そして何が起こるか見てください。

また、ループ内の readLine() への呼び出しを削除しました。この時点で、その行は既に読み取られています。

于 2012-10-27T23:25:38.180 に答える
1

あなたはダブルリードを実行しています

while((s=in.readLine())!=null){
    s=in.readLine();

while 条件内で行を読み取り、その直後に別の行を読み取ろうとすると、おそらくファイルの最後に到達します。

2 番目の in.readLine() ステートメントを削除してみてください

于 2012-10-27T23:26:24.527 に答える
0

ループが繰り返されるたびに 2 行を読んでいます。を取り外します

s=in.readLine(); 

ループに含まれています。

于 2012-10-27T23:27:13.217 に答える
0

他の人が述べたように、検査の 2 倍の速度で行を誤って読んでいます。彼らのソリューションは、問題の根本に対処します。

ただし、メモリが問題ではなく、Java 7を使用している場合は、 Files.readAllLinesに興味があるかもしれません。

List<String> lines = Files.readAllLines(path, Charset.defaultCharset() );

ドキュメントから:

ファイルからすべての行を読み取ります。このメソッドは、すべてのバイトが読み取られるか、I/O エラーまたはその他の実行時例外がスローされたときに、ファイルが閉じられることを保証します。ファイルからのバイトは、指定された文字セットを使用して文字にデコードされます... このメソッドは、1 回の操作ですべての行を読み取ることが便利な単純なケースを対象としていることに注意してください。大きなファイルを読み取るためのものではありません

この方法を使用する利点は、詳細を抽象化し、ファイルを閉じる処理を行い、一般的に使いやすいことです。

于 2012-10-27T23:30:01.580 に答える