Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在读取文本文件时检查行中是否有无法打印的字符_Java_File_File Io - Fatal编程技术网

Java 在读取文本文件时检查行中是否有无法打印的字符

Java 在读取文本文件时检查行中是否有无法打印的字符,java,file,file-io,Java,File,File Io,我的程序必须逐行读取文本文件。 UTF-8格式的文件。 我不确定文件是否正确-可能包含无法打印的字符。 是否可以在不进入字节级别的情况下检查它? 谢谢。虽然使用BufferedReader和InputStreamReader手动执行此操作并不困难,但我会使用: List lines=Files.readLines(文件,Charsets.UTF_8); 然后你可以用这些台词做任何你喜欢的事情 编辑:请注意,这将一次性将整个文件读入内存。在大多数情况下,这实际上是很好的,而且肯定比逐行阅读要简单

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

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

List lines=Files.readLines(文件,Charsets.UTF_8);
然后你可以用这些台词做任何你喜欢的事情

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

用a打开文件,然后用a和UTF-8从流中读取字符,用a读取行,例如via,这将给您一个字符串。一旦你有了字符串,你就可以检查那些不是你认为可以打印的字符。 例如(无错误检查),使用(在模糊的现代Java版本中):


如果文件中的每个字符都正确地用UTF-8编码,那么使用UTF-8编码的读取器读取它不会有任何问题。到你检查文件的每一个字符,看看你是否认为它是可打印的。 如果要检查字符串是否包含无法打印的字符,可以使用正则表达式

[^\p{Print}]

刚刚发现,使用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);
}
List lines=Files.readAllLines(path.get(“/tmp/test.csv”)、StandardCharsets.UTF_8);
用于(字符串行:行){
系统输出打印项次(行);
}

与其处理
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

 }

来源:

由@T.J.Crowder提供的答案是Java 6-在Java 7中,有效答案是由@McIntosh提供的-尽管不建议使用字符集作为UTF-8的名称:

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

我可以找到以下方法

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());
    }
private static final String fileName=“C:/Input.txt”;
公共静态void main(字符串[]args)引发IOException{
streamlines=Files.lines(path.get(fileName));
lines.toArray(字符串[]::新建);
List readAllLines=Files.readAllLines(path.get(fileName));
readAllLines.forEach->System.out.println;
文件=新文件(文件名);
扫描仪=新扫描仪(文件);
while(scanner.hasNext()){
System.out.println(scanner.next());
}


您想检查一行还是整个文件?是否保证换行符是正确的?检查单行。是的,换行符是正确的。您的意思是不能用特定字体打印的字符吗?任何字体中都有未定义的字符。这可能是同一件事。番石榴也提出了一种回调方法readLines(文件文件、字符集、字符集、行处理器回调)如果目的是逐行处理,那么使用BufferedRead也很简单。在核心Java库已经支持的情况下,仅仅为了行读取而添加另一个库依赖项也太过繁琐了。@user172818:不,它没有那么简单……至少如果您没有使用Java 7的try with resources语句的话。此外,我会感到惊讶d在任何一个非平凡的Java程序中,它不能在多个地方从Guava中受益。它是一个很棒的库,我不会没有它。只想添加,Java.nio.file.*从JDK 7开始就可用。值得一提的是doc for:此方法适用于简单的情况,在一个操作中可以方便地读取所有行。它不适用于大容量阅读files@fabian你是对的,我一直在使用它:)但是,这包括你的非打印字符集中的空格和制表符,而它们会影响单词在页面中的位置。或者,少一步,用文件读取器打开文件,用BufferedReader读取行。@stviper:现在是2015年,我已经更新了它,使用try with resources,更干净了。:-@abhisheknaik96:谢谢你的编辑,但是只有
isr
位是正确的;
()
应该是
()
,而不是
{}
,最后的分号是不需要的(但这是允许的,所以我留下了它——更符合上面的行)。不-删除它-您使用的是默认编码-并进入了一个痛苦的世界。对Java 6有效的答案对Java 7仍然有效。@user207421如果有更好的方法做它,实际上并不是这样
List<String> lines = Files.readAllLines(Paths.get("/tmp/test.csv"),
    StandardCharsets.UTF_8);
for(String line: lines){ /* DO */ }
BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8);
for (String line = reader.readLine(); line != null; line = reader.readLine()) {}
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());
    }