it-swarm.cn

读取文本文件时检查行中不可打印的字符

我的程序必须逐行读取文本文件。 UTF-8中的文件。我不确定文件是否正确-可能包含无法打印的字符。是否可以在不进行字节级检查的情况下进行检查?谢谢。

48
user710818

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

[^\p{Print}]
15
Peter Lawrey

使用 FileInputStream 打开文件,然后使用 InputStreamReader 和UTF-8 Charset 从流中读取字符,并使用- 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);

然后,您可以使用这些行执行任何操作。

编辑:请注意,这将一次性将整个文件读入内存。在大多数情况下,这实际上还不错-并且肯定简单比逐行读取它,并在读取时处理每一行。如果文件很大,您可能需要按照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的答案-尽管不建议将Charset用作UTF -8的名称:

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

提醒了Skeet上面发布的很多Guava方式-当然也有同样的警告。也就是说,对于大文件(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