我想将包含UTF-8数据的对象存储到文件中。不幸的是,我没有尝试过任何工作。非常感谢您的建议。我的代码如下:
public static void saveData(MyClass myData) {
try (FileOutputStream fs = new FileOutputStream("data.ser");
ObjectOutputStream os = new ObjectOutputStream(fs)) {
ArrayList<MyClass> dataOld = new ArrayList<>();
ArrayList<MyClass dataNew = getData();
for (int i = 0; i < dataOld.size(); i++) {
dataNew.add(dataOld.get(i));
}
dataNew.add(myData);
os.writeObject(dataNew);
} catch (FileNotFoundException e) {
System.out.println("File not found");
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static ArrayList<MyClass> getData() {
ArrayList<MyClass> data= null;
try (FileInputStream fi = new FileInputStream("data.ser"); ObjectInputStream os = new ObjectInputStream(fi)) {
data= (ArrayList<MyClass>) os.readObject();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return data;
}
除非我在对象中存储UTF 8字符,否则此解决方案适用于每种情况。
答案 0 :(得分:0)
MyClass的字符串元素未正确编码。
好吧,我不希望他们那样。字符串被序列化为修改的UTF-8;参见https://docs.oracle.com/javase/7/docs/platform/serialization/spec/protocol.html。如果您尝试使用标准的UTF-8查看器查看数据,则字节数和其他数据很可能会在某种程度上“弄乱”文本。
(但是,如果字符串数据不像修改过的UTF-8那样有意义,那么问题在于原始字符串中的文本已经被弄乱了……)
我认为这里的真正问题是您的期望。
ObjectOutputStream
产生的数据流是二进制的,而不是文本。它不是用UTF-8编码的,因为不可能将任意流直接编码为UTF-8。而且,如果您尝试将ObjectOutputStream
输出显示/解码为UTF-8,则会出现解码错误或垃圾。
解决方案取决于您要实现的目标:
如果您尝试通过文本通道发送MyClass
的编码实例,那么您需要做的是使用Base64之类的二进制流进行编码。结果将不清晰(人类可读),但是您将能够颠倒该过程并构造与原始对象等效的MyClass
实例。
如果您要使ObjectOutputStream
的输出易于阅读,则将无法正常工作。 Java对象序列化格式基本上是二进制的。如果您希望序列化的数据(人类)可读,则应使用其他序列化格式;例如JSON或XML。