我的程序必须逐行读取文本文件。 文件采用UTF-8编码。 我不确定文件是否正确 - 可能包含无法打印的字符。 是否可能在不涉及字节级别的情况下进行检查? 谢谢。
使用 FileInputStream
打开文件,然后使用带有 UTF-8 Charset
的 InputStreamReader
从流中读取字符,并使用 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
}
}
()
应该是()
,而不是{}
,最后一个分号不是必需的(但允许使用,因此我已将其留下 - 更符合它上面的行)。 - T.J. Crowder虽然使用 BufferedReader
和 InputStreamReader
手动实现不难,但我会使用 Guava 库:
List<String> lines = Files.readLines(file, Charsets.UTF_8);
你可以随意处理那些行。
注意:这将一次性将整个文件读入内存。在大多数情况下,这实际上是可以的 - 而且肯定比逐行读取并在读取每行时处理每行要简单。如果是一个巨大的文件,您可能需要按照T.J. Crowder的答案进行操作。
刚刚发现在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);
}
不再使用FileInputStream
和BufferedReader
,而是...
如果您想检查一个字符串是否包含不可打印的字符,您可以使用正则表达式
[^\p{Print}]
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
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());
}
@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()) {}