web-dev-qa-db-ja.com

テキストファイルの読み取り中に、印刷できない文字の行を確認します

私のプログラムはテキストファイルを1行ずつ読み取る必要があります。 UTF-8のファイル。ファイルが正しいかどうかはわかりません-印刷できない文字が含まれている可能性があります。バイトレベルに移動せずにそれをチェックすることは可能ですか?ありがとう。

48
user710818

文字列に印刷できない文字があるかどうかを確認する場合は、正規表現を使用できます

[^\p{Print}]
15
Peter Lawrey

FileInputStream でファイルを開き、UTF-8 InputStreamReaderCharset を使用して、ストリームから文字を読み取り、-を使用します BufferedReader 行を読み込むため、例えば BufferedReader#readLine を使用して、文字列を提供します。文字列を取得したら、印刷可能とは思わない文字をチェックできます。

例えば。 (エラーチェックなし)、 try-with-resources (漠然と現代のJavaバージョン)を使用:

String line;
try (
    InputStream fis = new FileInputStream("the_file_name");
    InputStreamReader isr = new InputStreamReader(fis, Charset.forName("UTF-8"));
    BufferedReader br = new BufferedReader(isr);
) {
    while ((line = br.readLine()) != null) {
        // Deal with the line
    }
}
121
T.J. Crowder

BufferedReaderInputStreamReaderを使用して手動でこれを行うのは難しくありませんが、 Guava を使用します。

List<String> lines = Files.readLines(file, Charsets.UTF_8);

その後、これらの行で好きなことを行うことができます。

編集:これにより、ファイル全体が一度にメモリに読み込まれることに注意してください。ほとんどの場合、それは実際には問題ありません-そして、それは確かに1行ごとにそれを読むよりも簡単です、あなたがそれを読むごとに各行を処理します。巨大なファイルの場合、T.Jに従ってそのようにする必要があるかもしれません。クラウダーの答え。

49
Jon Skeet

Java NIO(Java.nio.file.*)を使用すると、簡単に記述できることがわかりました。

List<String> lines=Files.readAllLines(Paths.get("/tmp/test.csv"), StandardCharsets.UTF_8);
for(String line:lines){
  System.out.println(line);
}

FileInputStreamsおよびBufferedReadersを処理する代わりに...

42
McIntosh

以下はどうですか:

 FileReader fileReader = new FileReader(new File("test.txt"));

 BufferedReader br = new BufferedReader(fileReader);

 String line = null;
 // if no more lines the readLine() returns null
 while ((line = br.readLine()) != null) {
      // reading lines until the end of the file

 }

ソース: http://devmain.blogspot.co.uk/2013/10/Java-quick-way-to-read-or-write-to-file.html

11
xproph

次の方法を見つけることができます。

private static final String fileName = "C:/Input.txt";

public static void main(String[] args) throws IOException {
    Stream<String> lines = Files.lines(Paths.get(fileName));
    lines.toArray(String[]::new);

    List<String> readAllLines = Files.readAllLines(Paths.get(fileName));
    readAllLines.forEach(s -> System.out.println(s));

    File file = new File(fileName);
    Scanner scanner = new Scanner(file);
    while (scanner.hasNext()) {
        System.out.println(scanner.next());
    }
5
Kumar Abhishek

@ T.J.Crowderの答えはJava 6です-Java 7の有効な答えは@McIntoshによるものです-ただし、UTF -8の名前にCharsetを使用することは推奨されません。

List<String> lines = Files.readAllLines(Paths.get("/tmp/test.csv"),
    StandardCharsets.UTF_8);
for(String line: lines){ /* DO */ }

上記のスキートが投稿した多くのグアバの方法を思い起こさせます-そしてもちろん同じ警告が適用されます。つまり、大きなファイル(Java 7)の場合:

BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8);
for (String line = reader.readLine(); line != null; line = reader.readLine()) {}
2
Mr_and_Mrs_D

ファイル内のすべての文字がUTF-8で適切にエンコードされていれば、UTF-8エンコーディングのリーダーを使用して問題なく読むことができます。ファイルのすべての文字をチェックし、それが印刷可能かどうかを確認するのはあなた次第です。

0
JB Nizet