将字节数组写入一个UTF8编码的文件

3

假设有一个UTF-8编码的字节数组(作为字符串Base64解码的结果),请问正确的将其写入UTF-8编码文件的方式是什么?

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

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

它是重复的(https://dev59.com/4nNA5IYBdhLWcg3wVcT6) - E Do
3
如果您已经拥有字节缓冲区,则不需要使用Writer。Writer用于编写字符或字符串。 - Robert
2
根据您在下面答案中的评论,您确定您的数组是以UTF-8编码的吗?只有当原始数据本身以UTF-8编码时,它才会这样。您的base64编码输入是什么? - RealSkeptic
一些对象使用Base64.encode进行编码...(我知道这是一个愚蠢的答案,但源代码有2500个Java文件) - Alexander Farber
2
这是 Base64 的代码,但它编码的是什么?你确定它们是字符串吗?它们是 Java 字符串吗?还是从字符串转换而来的字节数组?如果你不知道实际对象是什么,那么将它们打印出来会很困难,因为你甚至不知道它们是字符串。在 Base64 中,你可以编码 任何东西,包括图像和声音。 - RealSkeptic
@RealSkeptic 是正确的;你必须知道传递到 Base64.encode 的内容,才能确定这是否有效。 - Louis Wasserman
1个回答

5
不要使用Writer,只需使用OutputStream。使用try-with-resource的完整解决方案如下:
try (FileOutputStream fos = new FileOutputStream(tmpFile)) {
    fos.write(buffer);
}

甚至更好,如下所示:

Jon在下面指出:

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

2
或者使用 Files.write 使其更加简单。 - Jon Skeet
当我只使用OutputStream时,会出现错误(稍后,在尝试使用Efficient XML时):无效的1字节UTF-8序列的第1个字节。因此,我正在尝试找到一种适当的方法以UTF-8编码将字节数组写入文件。 - Alexander Farber
7
但是你说这个数组已经使用了UTF-8编码,对吗?我认为你应该检查一下你的假设。确保buffer确实是正确的UTF-8格式,并且它表示了Efficient XML可以处理的内容。 - aioobe
我认为问题在于读取时,需要同时创建一个缓冲区进行读写。 - Nitin Dandriyal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接