【问题标题】:Java, ObjectOutputStream.writeObject prints random symbols to fileJava,ObjectOutputStream.writeObject 将随机符号打印到文件
【发布时间】:2013-06-21 14:00:02
【问题描述】:
public class Customer {
     public static void main(String[] args) throws IOException {

         FileOutputStream a = new FileOutputStream("customer.txt");
         ObjectOutputStream b = new ObjectOutputStream(a);

         human Iman = new human("Iman",5000);
         human reda = new human("reda",5555);

         b.writeObject(Iman);   //prints random symbols. 
         b.writeObject(reda);     
    }
}

class human implements Serializable{
        private String name;
        private double balance;

        public human(String n,double b){
            this.name=n;
            this.balance=b;
        }
}

这些随机符号代表什么?

【问题讨论】:

  • 是的,Serializable 以机器可读的格式写出对象。它不是供你阅读的,它是供 Java 程序读回的。如果您想以人类可读的方式输出它,则必须直接使用FileOutputStream 编写自己的输出逻辑。

标签: java serialization objectoutputstream


【解决方案1】:

是的,您正在尝试存储对象本身,因此正在存储二进制格式。

要实际以文本格式存储数据,请使用以下代码 BufferedWriter,如下所示:

public void writeHumanStateToFile(Human human){
          try{
            File file = new File("filename.txt");


            if (!file.exists()) {
                file.createNewFile();
            }

            FileWriter fw = new FileWriter(file);
            BufferedWriter bw = new BufferedWriter(fw);

            bw.write(human.getName);
            bw.write(human.getBalance);
            bw.newLine();
            bw.close();
           }catch(IOException ex){
                ex.printStackTrace();
           }
       }

我假设你想保持 Human 对象的状态。

【讨论】:

    【解决方案2】:

    您正在使用ObjectOutputStream。这不会产生文本 - 它会产生数据的 binary 序列化版本。如果您确实需要文本表示,则需要使用不同的方法。

    如果您对它是二进制数据感到满意,请保持原样 - 但也许更改文件名以减少误导。您可以使用ObjectInputStream 再次读取数据。

    【讨论】:

      【解决方案3】:

      Object Serialization Stream Protocol 文档中描述了数据格式。正如您所指出的,它不是人类可读的。

      如果您想以可读格式序列化,您可以使用java.beans.XMLEncoder,或类似Pojomatic

      【讨论】:

        【解决方案4】:

        您正在序列化对象。它不是为了以纯文本可读,而是一种二进制格式,便于读取对象并在以后的程序执行中重新创建它。

        如果您想以纯文本形式存储对象,则需要将对象的各个字段写入文件。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-17
          相关资源
          最近更新 更多