2016-10-11 19 views
3

私は次のコードを持っています。何らかの理由でファイルの終わりに達していないので、whileループは決して終わりません。ファイルリーダーが正しく機能していませんか?

public class Temp { 
FileReader fr; 

Temp() { 
    try { 
     fr = new FileReader("File path"); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
} 

public static void main(String[] args) { 
    Temp ob = new Temp(); 

    try { 
     char c; 
     while ((c = (char) ob.fr.read()) != -1) { 
      System.out.println(c); 
     } 
     ob.fr.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

これを解決する手助けができますか?ありがとうございます。

+0

これは非常に悪いです、どこで、これはから手に入れましたか?あなたは何をしようとしています、そして、誰かがより良いリファレンスを指し示すでしょう。 – matt

+0

@mattファイルリーダーのトピックをもう一度訪れました。そして、私は基本を忘れてしまった。 ;) –

+0

したがって、FileReaderは、文字エンコーディングが不十分なために使用することを強く推奨していません。より良いオプションは、[Files.newBufferedReader](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#newBufferedReader-java.nio.file)を使用することです。 Path-java.nio.charset.Charset-)次は[ARM](https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html)です。私はあまりにも否定的であることを意味するわけではありませんが、あなたがこのプログラムを始めたばかりなので、現在の正しい技法を使用して見るほうがはるかに良いでしょう。乾杯。 – matt

答えて

6

の符号なしタイプの-1,と比較しています。それをしないでください。 cintを宣伝していますので、代わりに65535となります。代わりに、cintにして、ループ本体の内側にcharにキャストします。

int c; 
while ((c = ob.fr.read()) != -1) { 
    System.out.println((char) c); 
} 

私はまた、あなたがここにFileReaderのローカル変数を使用している可能性が...ただ変数に何かを格納するための新しいオブジェクトを作成に対して助言するだろう。

また、私はお勧めする:

  • だけで何も
  • 使い方間違ってなかったかのように例外がスローされた場合に継続していないのtry-と資源の代わりに、手動で読者
  • の回避を閉じますFileReaderは、常にデフォルトのエンコーディングを使用しています。 (InputStreamReaderFileInputStreamを使用して、またはJava 7からわずかFiles.newBufferedReaderを使用しています。)
+0

ありがとうございます。わかった。 :) –

関連する問題