当前位置: 首页 > 面试题库 >

Files.readAllBytes与Files.lines获得MalformedInputException

戎桐
2023-03-14
问题内容

我以为以下两种读取文件的方法应该表现相同。但是他们没有。第二种方法是抛出一个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

这里有什么区别,我该如何解决?


问题答案:

这与字符编码有关。计算机只处理数字。要存储文本,必须使用某种方案将文本中的字符与数字进行相互转换。该方案称为字符编码。有许多不同的字符编码。一些众所周知的标准字符编码是ASCII,ISO-8859-1和UTF-8。

在第一个示例中,您读取了文件中的所有字节(数字),然后通过将它们传递给class的构造函数将其转换为字符String。这将使用系统的默认字符编码(无论您的操作系统是什么)将字节转换为字符。

Files.lines(...)根据文档,在使用示例的第二个示例中,将使用UTF-8字符编码。如果在文件中找到的字节序列不是有效的UTF-8序列,则会得到一个MalformedInputException

系统的默认字符编码可能为UTF-8,也可能不是UTF-8,因此可以解释行为上的差异。

您必须找出用于文件的字符编码,然后显式使用它。例如:

String content = new String(Files.readAllBytes(Paths.get("_template.txt")),
        StandardCharsets.ISO_8859_1);

第二个例子:

Stream<String> lines = Files.lines(Paths.get("_template.txt"),
        StandardCharsets.ISO_8859_1);


 类似资料:
  • 从0.13版本开始,可以通过引用尚未在数据帧中的. loc或. ix中的索引来追加到数据帧。看到留档。 那么我就不明白为什么这条线失败了: 这将生成ValueError: 这里是所有的治疗方法。形状=(53,12),,,,。 在这里设置放大的正确方法是什么?

  • 我试着用拉威尔·科尔斯(https://github.com/barryvdh/laravel-cors)使用Laravel 5.2更新数据,但我总是得到相同的错误: 无法加载XMLHttpRequesthttp://dev.pesanlab.com/api/v1/order/cart/add. 请求的资源上不存在“Access Control Allow Origin”标头。起源'http://

  • 我的要求是托管API,并将Function Apps作为后端。我还想要那些API的留档(通过函数应用程序代码自动生成(所以我不必在Api管理上写留档)) 我已经设置了API管理,以便从通过FunctionApp中的URL公开的swagger文件(OpenAPI)导入API。 API看起来不错,我可以在API管理的开发者门户中看到它。但当我真的打电话时,401失败了。 我猜当API管理层发送请求时,

  • 问题内容: 我有以下代码,旨在读取目录并将其压缩到tar.gz归档文件中。当我将代码部署到服务器上并使用一批文件对其进行测试时,它可以在前几个测试批处理中使用,但是在第4批或第5批处理之后,它将始终如一地为我提供java.lang.OutOfMemoryError:即使直接缓冲内存文件批处理大小保持不变,并且堆空间看起来不错。这是代码: } 这是一个例外: 我认为有一个缓冲区内存泄漏,因为它在前4

  • 我正在尝试(失败)设置一个简单的FastAPI项目,并使用uvicorn运行它。这是我的代码: 这是我从终端运行的内容: 如你所见,我找不到404。原因可能是什么?一些与网络相关的东西,可能是防火墙/vpn阻止此连接或其他什么?我是新来的。提前谢谢!

  • 我在使用pymongo进行mongodb聚合时遇到了< code >聚合结果超过最大文档大小(16MB)错误。 起初,我使用< code>limit()选项克服了这个问题。然而,在某个时候,我得到了 好的,我将使用 选项。当我在命令行上使用它时,此选项有效,但是当我尝试在我的 python 代码中使用时,此选项有效 我得到< code>TypeError: aggregate()正好接受2个参数(