我的程序必须逐行读取文本文件。 UTF-8中的文件。 我不确定文件是否正确 - 可以包含不可打印的字符。 是否可以检查它而不进入字节级别? 感谢。
答案 0 :(得分:121)
使用FileInputStream
打开文件,然后使用带有UTF-8 InputStreamReader
的Charset
来读取流中的字符,并使用BufferedReader
读取行,例如通过BufferedReader#readLine
,它将为您提供一个字符串。获得字符串后,您可以检查不是您认为可打印的字符。
E.g。 (没有错误检查),使用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
}
}
答案 1 :(得分:49)
虽然使用BufferedReader
和InputStreamReader
手动执行此操作并不困难,但我会使用Guava:
List<String> lines = Files.readLines(file, Charsets.UTF_8);
然后你可以用这些线做任何你喜欢的事。
编辑:请注意,这将一次性将整个文件读入内存。在大多数情况下,这实际上很好 - 而且肯定更简单而不是逐行读取,在阅读时处理每一行。如果它是一个巨大的文件,你可能需要按照T.J.那样做。克劳德的答案。
答案 2 :(得分:42)
刚刚发现使用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
和BufferedReader
s ...
答案 3 :(得分:15)
如果要检查字符串是否包含不可打印的字符,可以使用正则表达式
[^\p{Print}]
答案 4 :(得分: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
}
来源:http://devmain.blogspot.co.uk/2013/10/java-quick-way-to-read-or-write-to-file.html
答案 5 :(得分: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());
}
答案 6 :(得分:3)
@ 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发布的很多番石榴方式 - 当然同样的警告也适用。也就是说,对于大文件(Java 7):
BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8);
for (String line = reader.readLine(); line != null; line = reader.readLine()) {}
答案 7 :(得分:1)
如果文件中的每个字符都以UTF-8正确编码,那么使用带有UTF-8编码的阅读器读取它时不会有任何问题。由你来检查文件的每个字符,看看你是否认为它是可打印的。