1

読み取ろうとしている.txtファイルがたくさんありますが、それらの多くは読み取れません。読み取れないものは、テキストの前に空白行があるように見えます。たとえば、以下は NoSuchElementException をスローします。

public static void main(String[] args) throws FileNotFoundException{
    Scanner input = new Scanner(new File("documentSets/med_doc_set/bmu409.shtml.txt"));
    System.out.println(input.next());
}

ここで、読み取られるテキスト ファイルは空白行で始まり、その後にテキストが続きます。また、 input.skip("[\\s]*") を使用して先頭の空白をスキップしようとしましたが、同じエラーがスローされます。これを修正する方法はありますか?

編集: Google ドキュメントでホストされているファイル。ダウンロードしてテキスト エディターで表示すると、最初の空の行が表示されます。

4

3 に答える 3

3

入力の処理に関しては、Scanner型が奇妙に一貫していません。これは I/O 例外を飲み込みます (消費者はこれらを明示的にテストする必要があります)。そのため、読者にエラーを通知するのは簡単ではありません。しかし、文字データをデコードするときの型は厳密です。正しくエンコードされていないテキストや間違ったエンコーディングを使用するとIOException、型がすぐに飲み込んでしまう an が発生します。

このコードは、エラー チェックを使用してテキスト ファイル内のすべての行を読み取ります。

  public static List<String> readAllLines(File file, Charset encoding)
      throws IOException {
    List<String> lines = new ArrayList<>();
    try (Scanner scanner = new Scanner(file, encoding.name())) {
      while (scanner.hasNextLine()) {
        lines.add(scanner.nextLine());
      }
      if (scanner.ioException() != null) {
        throw scanner.ioException();
      }
    }
    return lines;
  }

このコードは行を読み取り、デコーダーが理解できないコードポイントを疑問符に変換します。

  public static List<String> readAllLinesSloppy(File file, Charset encoding)
      throws IOException {
    List<String> lines = new ArrayList<>();
    try (InputStream in = new FileInputStream(file);
        Reader reader = new InputStreamReader(in, encoding);
        Scanner scanner = new Scanner(reader)) {
      while (scanner.hasNextLine()) {
        lines.add(scanner.nextLine());
      }
      if (scanner.ioException() != null) {
        throw scanner.ioException();
      }
    }
    return lines;
  }

これらの方法は両方とも、多くの場合 Unicode ではないデフォルトのエンコーディングに依存するのではなく、エンコーディングを明示的に提供する必要があります (標準の定数も参照してください)。

コードは Java 7 構文であり、テストされていません。

于 2012-09-03T08:07:17.417 に答える
1

空白行で始まり、コードの最初の行のみを出力しているので、次のように変更します。

public static void main(String[] args) throws FileNotFoundException{
    Scanner input = new Scanner(new File("documentSets/med_doc_set/bmu409.shtml.txt"));
    while(input.hasNextLine()){
        System.out.println(input.nextLine());
    }
}
于 2012-09-02T20:38:10.590 に答える
0

スキャナーは、行末までのすべての単語または数字を読み取ります。この時点で、nextLine() を呼び出す必要があります。例外を取得したくない場合は、hasNextXxxx() メソッドの 1 つを呼び出して、その型を読み取ることができるかどうかを判断する必要があります。

于 2012-09-02T20:39:27.810 に答える