【问题标题】:Writing byte array to an UTF8-encoded file将字节数组写入 UTF8 编码文件
【发布时间】:2015-08-01 11:10:17
【问题描述】:

给定一个 UTF-8 编码的字节数组(base64 decoding of a String 的结果) - 请问将它写入 UTF-8 编码文件的正确方法是什么?

下面的源码(逐字节写数组)是否正确?

OutputStreamWriter osw = new OutputStreamWriter(
    new FileOutputStream(tmpFile), Charset.forName("UTF-8"));
for (byte b: buffer)
    osw.write(b);
osw.close();

【问题讨论】:

  • 如果您已经有一个字节缓冲区,则不需要编写器。 writer 用于编写字符或字符串。
  • 根据您对以下答案的评论,您确定您的数组采用 UTF-8 编码吗?只有以 base64 编码的原始数据本身是 UTF-8 时才会如此。你的 base64 编码的输入是什么?
  • 一些用Base64.encode编码的对象...(我知道这是一个愚蠢的答案,但源代码很大,有2500个Java文件)
  • 那是Base64的代码,但是用它编码了什么?你确定它们是字符串吗?它们是 Java 字符串吗?它们是从字符串转换而来的字节数组吗?如果您不知道实际的对象是什么,则很难打印它们,因为您甚至都不知道它们是字符串。您可以在 base64 中编码任何内容,包括图像和声音。

标签: java utf-8 java-io


【解决方案1】:

不要使用Writer。只需使用OutputStream。使用 try-with-resource 的完整解决方案如下所示:

try (FileOutputStream fos = new FileOutputStream(tmpFile)) {
    fos.write(buffer);
}

甚至更好,正如 Jon 在下面指出的那样:

Files.write(Paths.get(tmpFile), buffer);

【讨论】:

  • Files.write 更简单。
  • 当我只使用 OutputStream 时,我得到了错误(后来,trying to use Efficient XML):1 字节 UTF-8 序列的字节 1 无效。所以我试图找到一种将字节数组写入 UTF-8 编码文件的正确方法
  • 但是你说数组是UTF-8编码的,不是吗?我认为你应该检查你的假设。确保 buffer 确实是正确的 UTF-8,并且它代表 Efficient XML 可以处理的东西。
  • 我认为问题在于在这种情况下读取时,创建一个同时读写的缓冲区
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-10
  • 1970-01-01
  • 2021-01-09
  • 2019-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多