【发布时间】:2015-07-08 09:02:48
【问题描述】:
我原以为以下两种读取文件的方法应该表现相同。但他们没有。第二种方法是抛出MalformedInputException。
public static void main(String[] args) {
try {
String content = new String(Files.readAllBytes(Paths.get("_template.txt")));
System.out.println(content);
} catch (IOException e) {
e.printStackTrace();
}
try(Stream<String> lines = Files.lines(Paths.get("_template.txt"))) {
lines.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
}
这是堆栈跟踪:
Exception in thread "main" java.io.UncheckedIOException: java.nio.charset.MalformedInputException: Input length = 1
at java.io.BufferedReader$1.hasNext(BufferedReader.java:574)
at java.util.Iterator.forEachRemaining(Iterator.java:115)
at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
at Test.main(Test.java:19)
Caused by: java.nio.charset.MalformedInputException: Input length = 1
at java.nio.charset.CoderResult.throwException(CoderResult.java:281)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:161)
at java.io.BufferedReader.readLine(BufferedReader.java:324)
at java.io.BufferedReader.readLine(BufferedReader.java:389)
at java.io.BufferedReader$1.hasNext(BufferedReader.java:571)
... 4 more
这里有什么区别,我该如何解决?
【问题讨论】:
-
一种方法读取字节,一种读取文本。你的文件是文本文件吗?什么是编码?
-
此外,
Files.lines()的默认编码是 UTF-8。并非每个字节序列都是有效的 UTF-8。 -
嗯,我想我需要一点帮助来回答你的问题。该文件是一个文本文件。用记事本++打开它在状态栏中显示ANSI。这能回答你的问题吗?
-
@Phylogenesis 感谢您的链接。前段时间我确实读过。我最近决定再读一遍。可能现在是阅读它的正确时机:-D