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

use*_*818 48 java file-io file

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

T.J*_*der 121

使用a打开文件FileInputStream,然后使用InputStreamReader带有UTF-8 的文件Charset从流中读取字符,并使用a BufferedReader来读取行,例如via 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
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 或者,再少一步,使用FileReader打开文件,然后使用BufferedReader读取行。 (2认同)

Jon*_*eet 49

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

List<String> lines = Files.readLines(file, Charsets.UTF_8);
Run Code Online (Sandbox Code Playgroud)

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

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

  • @ user172818:不,它不是那么简单......至少如果你没有使用带有try-with-resources语句的Java 7.另外,在任何非平凡的Java程序中,我都会感到非常惊讶*这些程序无法从多个*位置的番石榴中受益.这是一个很棒的图书馆,我不会没有它. (5认同)
  • Guava alse提出了一个带回调的方法Files.readLines(文件文件,Charset charset,LineProcessor <T>回调) (4认同)

McI*_*osh 42

刚刚发现使用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);
}
Run Code Online (Sandbox Code Playgroud)

而不是处理FileInputStreams和 BufferedReaders ...

  • 值得一提的是[Files.readAllLines](http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html)的文档:_这个方法适用于简单的情况在单个操作中读取所有行的方便.它不适合在大文件中阅读_ (3认同)

Pet*_*rey 15

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

[^\p{Print}]
Run Code Online (Sandbox Code Playgroud)


小智 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

 }
Run Code Online (Sandbox Code Playgroud)

资料来源:http://devmain.blogspot.co.uk/2013/10/java-quick-way-to-read-or-write-to-file.html


Kum*_*hek 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());
    }
Run Code Online (Sandbox Code Playgroud)