在读取文本文件时检查行是否有不可打印的字符

时间:2011-09-14 09:06:40

标签: java file file-io

我的程序必须逐行读取文本文件。 UTF-8中的文件。 我不确定文件是否正确 - 可以包含不可打印的字符。 是否可以检查它而不进入字节级别? 感谢。

8 个答案:

答案 0 :(得分:121)

使用FileInputStream打开文件,然后使用带有UTF-8 InputStreamReaderCharset来读取流中的字符,并使用BufferedReader读取行,例如通过BufferedReader#readLine,它将为您提供一个字符串。获得字符串后,您可以检查不是您认为可打印的字符。

E.g。 (没有错误检查),使用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
    }
}

答案 1 :(得分:49)

虽然使用BufferedReaderInputStreamReader手动执行此操作并不困难,但我会使用Guava

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

然后你可以用这些线做任何你喜欢的事。

编辑:请注意,这将一次性将整个文件读入内存。在大多数情况下,这实际上很好 - 而且肯定更简单而不是逐行读取,在阅读时处理每一行。如果它是一个巨大的文件,你可能需要按照T.J.那样做。克劳德的答案。

答案 2 :(得分:42)

刚刚发现使用Java NIO(java.nio.file.*),您可以轻松地写出:

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

而不是处理FileInputStreamBufferedReader s ...

答案 3 :(得分:15)

如果要检查字符串是否包含不可打印的字符,可以使用正则表达式

[^\p{Print}]

答案 4 :(得分:11)

下面怎么样:

 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

答案 5 :(得分:5)

我可以找到以下方法。

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());
    }

答案 6 :(得分:3)

@ T.J.Crowder的答案是Java 6 - 在java 7中,有效答案是@McIntosh的答案 - 尽管不鼓励使用Charset作为UTF -8的名称:

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

提醒上面Skeet发布的很多番石榴方式 - 当然同样的警告也适用。也就是说,对于大文件(Java 7):

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

答案 7 :(得分:1)

如果文件中的每个字符都以UTF-8正确编码,那么使用带有UTF-8编码的阅读器读取它时不会有任何问题。由你来检查文件的每个字符,看看你是否认为它是可打印的。