当尝试将一些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
答案 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));