ayyoobの信仰:
私は以下のコードを含むファイルを読んでいます:
Scanner in = new Scanner(new File(fileName));
while (in.hasNextLine()) {
String[] line = in.nextLine().trim().split("[ \t]");
.
.
.
}
私はVIMを使用してファイルを開くと、いくつかの行は、次の特殊文字で始まります。
しかし、Javaコードは、これらの行を読み取ることができません。それはこれらの行に達すると、それはファイルの終わりだとhasNextLine()関数がfalseを返すことを考えています!
EDIT:これは、言及した(問題の)ラインの進ダンプです。
0000000:9c20 302E 3230 3133 3220 3231 302E E280 ... 0.20132 0.21 0000010:3431 392d 302E 3034 0A 419から0.04。
そのほかの男:
@VGRはそれが右です。
TL; DR:使用 Scanner in = new Scanner(new File(fileName), "ISO-8859-1");
何が起こっているように見えることはということです。
- あなたのファイルは有効なUTF-8という唯一0x9C文字によるものではありません。
- これは、システムのデフォルトであるため、スキャナは、UTF-8のファイルを読んでいます
- 基礎となるライブラリが投げます
MalformedInputException
- スキャナの漁獲量と隠れること(善意が、見当違いのデザインの決定)
- それはもう行がないことを報告して開始します
- あなたが実際にスキャナを依頼しない限り、あなたは何も逝ってしまった間違っを知ることができません
ここでMCVEです:
import java.io.*;
import java.util.*;
class Test {
public static void main(String[] args) throws Exception {
Scanner in = new Scanner(new File(args[0]), args[1]);
while (in.hasNextLine()) {
String line = in.nextLine();
System.out.println("Line: " + line);
}
System.out.println("Exception if any: " + in.ioException());
}
}
ここでは、通常の呼び出しの例を示します。
$ printf 'Hello\nWorld\n' > myfile && java Test myfile UTF-8
Line: Hello
Line: World
Exception if any: null
ここでは、あなたが(あなたが取得し、隠された例外を表示しないことを除いて)見ているものです。何行が示されていないことを特に注意してください:
$ printf 'Hello\nWorld \234\n' > myfile && java Test myfile UTF-8
Exception if any: java.nio.charset.MalformedInputException: Input length = 1
そして、ここではISO-8859-1、すべてのバイト配列が(0x9Cが無い文字が割り当てられており、したがって、端末に表示されないにもかかわらず)有効であるにデコードとして復号化されている場合:
$ printf 'Hello\nWorld \234\n' > myfile && java Test myfile ISO-8859-1
Line: Hello
Line: World
Exception if any: null
あなただけASCIIデータに興味を持っているし、任意のUTF-8文字列を持っていない場合は、単に使用するスキャナを頼むことができるISO-8859-1
の2番目のパラメータとして渡すことでScanner
、コンストラクタ:
Scanner in = new Scanner(new File(fileName), "ISO-8859-1");