【问题标题】:How to serialize/deserialize with DataOutputStream and DataInputStream?如何使用 DataOutputStream 和 DataInputStream 进行序列化/反序列化?
【发布时间】:2015-07-30 14:24:27
【问题描述】:

我正在尝试使用 DataOutputSteam 和 DataInputSteam 而不是 ObjectInputStream/ObjectOutputStream 对事物进行序列化/反序列化。

序列化失败。 txt 文件仍然是空的。 当然,test2字符串最后都是空的(不能反序列化一个空文件)。

这是我的对象:

public class Test implements Serializable {
    public String[] nom;


    public Test() {

        nom = new String[5];
        nom[0] = "Coucou";
        nom[1] = "Je suis un tab de String";
        nom[2] = "Je vais me faire serialiser";
        nom[3] = "Et deserialiser aussi !";
        nom[4] = "Je suis le roi du monde !";
    } 
}

这是我的尝试:

    Test test = new Test();
    Test test2 = new Test();


    test2.nom[0] = "";
    test2.nom[1] = "";
    test2.nom[2] = "";
    test2.nom[3] = "";
    test2.nom[4] = "";

     DataInputStream dis;
     DataOutputStream dos;

   // serialisation manuelle
    try {
      dos = new DataOutputStream(
              new BufferedOutputStream(
                new FileOutputStream(
                  new File("nom2.txt"))));

      for(int i = 0; i < 5; i++)
      {  
             dos.writeUTF(test.nom[i]);
      } 
        } catch (FileNotFoundException e) {
    } catch (IOException e) {}      




    // deserialisation manuelle
       dis = new DataInputStream(
              new BufferedInputStream(
                new FileInputStream(
                  new File("nom2.txt"))));

    try { 
        test.nom[0] = dis.readUTF();
        test.nom[1] = dis.readUTF();
        test.nom[2] = dis.readUTF();
        test.nom[3] = dis.readUTF();
        test.nom[4] = dis.readUTF();
            } catch (FileNotFoundException e) {
    } catch (IOException e) {}

【问题讨论】:

  • 尝试调用dos.flush() 将内容写到文件中,然后再开始尝试读回文件。这可能是您的问题。
  • @soong 这行得通!但为什么 ?!冲洗有什么作用?
  • 序列化数据不是文本。 .txt 文件扩展名不合适。

标签: java serialization deserialization datainputstream dataoutputstream


【解决方案1】:

为了简短的解释,调用dos.flush() 将强制系统获取缓冲的任何内容并将其实际写入磁盘。出于这个原因,您需要在尝试从同一个文件中读取之前调用它。有关flush() 的更多详细信息,我建议您查看What is the purpose of flush() in Java streams?,因为之前已经回答过。

【讨论】:

    【解决方案2】:

    尝试关闭输出文件,然后再打开它进行阅读。在某些系统上,例如第二次打开你不会成功的Windows。

    关闭它会刷新BufferedOutputStream.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 2021-05-08
      • 1970-01-01
      • 1970-01-01
      • 2015-01-05
      • 1970-01-01
      相关资源
      最近更新 更多