[英]how to write UTF8 data to xml file using RandomAccessFile?
当尝试将一些 UTF8 数据写入文件时,我最终在文件中产生了一些垃圾。 代码如下
public static boolean saveToFile(StringBuffer buffer,
String fileName,
ArrayList exceptionList,
String className)
{
log.debug("In saveToFile for file [" + fileName + "]");
RandomAccessFile raf = null;
File file = new File(fileName);
File backupFile = new File(fileName+"_bck");
try
{
if (file.exists())
{
if (backupFile.exists())
{
backupFile.delete();
}
file.renameTo(backupFile);
}
raf = new RandomAccessFile(file, "rw");
raf.writeBytes(buffer.toString());
raf.close();
buffer.toString() 的输出是
<?xml version="1.0" encoding="UTF-8"?>
<ivr>
<version>1.1</version>
<templateName>αβγδεζη
但是文件中的数据是
<?xml version="1.0" encoding="UTF-8"?>
<ivr>
<version>1.1</version>
<templateName>▒▒▒▒▒▒▒</templateName>
如何确保文件本身中的数据是 UTF8
我不惊讶你得到垃圾:
raf.writeBytes(buffer.toString())
RandomAccessFile.writeBytes(String)
的文档说(强调):
将字符串作为字节序列写入文件。 通过丢弃其高八位,按顺序写出字符串中的每个字符。
在少数情况下,该操作将生成正确编码的文件。 但在大多数情况下不会。 这个writeBytes()
方法是 Java 开发人员的一个愚蠢的设计。 您需要将文本正确编码为 UTF-8 字节,然后写入这些字节。
您是否真的需要将文件作为随机访问文件进行操作。 如果没有,只需使用包装OutputStream
的Writer
操作它。
您可以使用Charset.encode(CharBuffer)
生成一个ByteBuffer
保存编码的字节,然后将这些字节写入文件:
raf.write(StandardCharsets.UTF_8.encode(buffer).array());
RandomAccessFile的Javadoc声明对于writeBytes()
将字符串作为字节序列写入文件。 通过丢弃其高八位,按顺序写出字符串中的每个字符。 写入从文件指针的当前位置开始。
假设丢弃部分 String不是您想要的,您应该使用writeUtf() :
以独立于机器的方式使用修改后的 UTF-8 编码将字符串写入文件。
String txt = buffer.toString();
raf.write(txt.getBytes(StandardCharsets.UTF_8));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.