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

时间:2014-07-24 11:43:59

标签: java utf-8 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

3 个答案:

答案 0 :(得分:0)

我没有惊讶你得到了垃圾:

 raf.writeBytes(buffer.toString())

RandomAccessFile.writeBytes(String)的文档说明(强调添加):

  

将字符串作为字节序列写入文件。字符串中的每个字符按顺序写出,丢弃其高八位

在少数情况下,该操作将导致正确编码的文件。但在大多数情况下,它不会赢。那个writeBytes()方法是Java开发人员的愚蠢设计。您需要将文本正确编码为UTF-8中的字节,然后写入这些字节。

确实需要将该文件作为随机访问文件进行操作。如果没有,只需使用Writer包裹OutputStream来操纵它。

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

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

答案 1 :(得分:0)

Javadoc for RandomAccessFile表示writeBytes()

  

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

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

  

使用修改后的UTF-8编码将字符串写入文件   与机器无关的方式。

答案 2 :(得分:0)

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