繁体   English   中英

如何使用 RandomAccessFile 将 UTF8 数据写入 xml 文件?

[英]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 字节,然后写入这些字节。

您是否真的需要将文件作为随机访问文件进行操作。 如果没有,只需使用包装OutputStreamWriter操作它。

您可以使用Charset.encode(CharBuffer)生成一个ByteBuffer保存编码的字节,然后将这些字节写入文件:

 raf.write(StandardCharsets.UTF_8.encode(buffer).array());

RandomAccessFileJavadoc声明对于writeBytes()

将字符串作为字节序列写入文件。 通过丢弃其高八位顺序写出字符串中的每个字符。 写入从文件指针的当前位置开始。

假设丢弃部分 String不是您想要的,您应该使用writeUtf()

以独立于机器的方式使用修改后的 UTF-8 编码将字符串写入文件。

String txt = buffer.toString();
raf.write(txt.getBytes(StandardCharsets.UTF_8));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM