在阅读文本文件的同时检查不可打印字符的行

我的程序必须读取文本文件 – 逐行。 UTF-8文件。 我不确定文件是否正确 – 可以包含不可打印的字符。 是否可以检查它没有去字节级? 谢谢。

如果你想检查一个string有不可打印的字符,你可以使用一个正则expression式

[^\p{Print}] 

使用FileInputStream打开文件,然后使用带有UTF-8 CharsetInputStreamReader从stream中读取字符,然后使用BufferedReader读取行,例如通过BufferedReader#readLine ,这会给你一个string。 一旦你有了string,你可以检查不是你认为可打印的字符。

例如(没有错误检查),使用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 } } 

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

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

然后,你可以做任何你喜欢的线。

编辑:请注意,这将一次去整个文件读入内存。 在大多数情况下,这实际上是好的 – 比读取它逐行更加简单,在读取它时处理每一行。 如果这是一个巨大的文件,你可能需要这样做,根据TJ克劳德的答案。

刚刚发现用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); } 

而不是处理FileInputStream s和BufferedReader s …

下面怎么样:

  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

我可以find以下方法。

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

@TJCrowder的答案是Java 6 – 在Java 7中,有效的答案是@McIntosh的答案 – 尽pipe它不鼓励使用字符集作为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()) {} 

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