Java存储具有UTF 8个字符的对象

时间:2018-08-14 13:22:07

标签: java utf-8

我想将包含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字符,否则此解决方案适用于每种情况。

1 个答案:

答案 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。