2017-11-21 28 views
1

TLを含むファイルのいずれかを読み取ることができません。特定の文字(複数可)

DRなぜのファイルに読み込みがNotepadいかなるデータを見つけることができませんか?

問題:

はこれまで、私はここで質問に答える/テスト用/書き込みテキストを読むためにただの老いNotepad(バージョン6.1)を使用してきました。コードの

単純なビットは、テキストファイルの内容を読み込み、およびコンソールにそれらを印刷します

Scanner sc = new Scanner(new File("myfile.txt")); 
while (sc.hasNextLine()) { 
    String text = sc.nextLine(); 
    System.out.println(text); 
} 

すべてがうまく、期待通りの線が印刷されます。

正確に文字:をテキストファイルのどこに置いても、ファイルを読み取ることはなく、コンソールには何も印刷されません。

もちろん、Notepad++または他の(より良い)テキストエディタを使用することはできますが、問題はありません。ダッシュ文字を含むテキストは期待どおりに印刷されます。

私もNotepadを使用して、UTF-8を指定することができ、それが正常に動作します:私の元Notepadファイルで

File fileDir = new File("myfile.txt"); 
BufferedReader in = new BufferedReader(
     new InputStreamReader(
       new FileInputStream(fileDir), "UTF8")); 
String str; 
while ((str = in.readLine()) != null) { 
     System.out.println(str); 
} 

、私はコピーしてNotepad++に(含む)のテキストを貼り付けると2を比較する場合WinMergeのファイルでは、Notepadのダッシュはですが、Notepad++の場合は–です。

質問:このNotepadで、テキストファイルで使用されている、それはは基本的にhasNextLine()が偽であることを私に言って、読まない

なぜ、?この特定の文字を含む行まで少なくとも入力を読み取るべきではないでしょうか?

再現手順:

  • Windows 7では、右クリックして、新しいテキストドキュメントを作成します。
  • は、ファイル内の任意の場所にこの文字に入れて(など、任意の特殊文字なし)ファイルに任意のテキストを置く:
  • 実行上記のコードの最初のブロック

出力:BUILD SUCCESSFUL (total time: 1 second)つまり、テキストのをに印刷しません。

PS:

私は尋ね知っquestion昨日(まあ、それは同じことになった)が、残念ながら、それは私がうまく自分自身を説明していないかもしれない、または視聴者の一部はdidnのようで似て質問を完全に読んではいけません。いずれにせよ、私はここでそれをより良く説明したと思う。

答えて

3

問題はエンコードの違いと思われます。ファイルが書き込まれたのと同じエンコーディングで読み込む必要があります。

あなたのシステムノートパッドはおそらくWindows-1252(またはCp-1252)エンコーディングを使用しています。 128〜159の範囲の文字でこのエンコーディングに問題がありました。この範囲の間にDashがあります。この範囲は、同等のISO 8859-1には存在せず、Cp1252エンコーディングでのみ存在します。

enter image description here

エクリプス、メモ帳ファイルを読み込むときに、(それが同等であるように)エンコードISO-8859-1を有するべきファイルを想定しています。しかし、この文字はISO-8859-1には存在しないため、問題です。 Javaから読み込みたい場合は、Cp1252を指定する必要があります。出力する必要があります。

これは、メモ帳のファイルがUTF-8で書かれているときに、UTF-8でコードが正しく動作する理由です。

+0

ええと、私はあなたが意味するものを参照してください。それでは、なぜ* *テキストを読まないのでしょうか?その特定の文字まで行を読み上げるべきでしょうか? – notyou

+0

私はそれについて本当に分かりません。おそらく、入力を最初に解析するScannerクラスを使用しているためです。あなたはBufferedReaderを試すことができます –

+0

あなたがバイトを取得して、Javaが実際にファイルFiles.readAllBytes(Path)を読み込んでいるかどうか調べてみることができます。 –

0

バッファリングされたリーダーは、問題のあるバイトまで現在の行以上を読み込みます。 Charset.CharsetDecoder.onMalformedInputが遊びに来て、何か制限がありますが、これは私が通常は期待していないものです。

特別なJDKを使用していますか?あなたはカーペットの下で例外を拭きますか?上記のコードをラムダで囲むように。 (キャッチThrowableを追加)

platfomはCp1252の代わりに-Dfile.encoding=ISO-8859-1をエンコードしていますか?

+0

私は 'UnsupportedEncodingException'を含むいくつかの例外をスローしますが、キャッチされません。私が言う限り、ここでは何も特別なことはありません。また、私はあなたの2つのコメントを読んでいたが、返信の過程にあったが、あなたはそれらを削除した: – notyou

+0

申し訳ありませんが、コメントはあまり良くはなかった、私はまだ最初のコーヒーを飲まなかった、あまりにも多く、したがってこの平凡な答えです。両方のエンコーディングを試しました。 Notepad ++はエンコードをテストするのに適したツールです。 –

関連する問題