【问题标题】:create object output stream from an object从对象创建对象输出流
【发布时间】:2011-02-21 20:03:05
【问题描述】:

我想在ObjectOutputStream 上创建,但我不想将对象保存在文件中,那该怎么做呢?所有的教程(我发现)都只说文件方式:

        FileOutputStream fos = new FileOutputStream("t.tmp");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(new Date());
        oos.close();

我想将对象存储到数据库中,所以我需要在类PreparedStatement 的方法setBinaryStream() 中指定一个流。

感谢您的回答...

【问题讨论】:

    标签: java database jdbc objectoutputstream


    【解决方案1】:

    改为将其存储在字节数组中。您可以为此使用ByteArrayOutputStream。这样你就可以使用PreparedStatement#setBytes()

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(baos);
    oos.writeObject(new Date());
    oos.close();
    // ...
    preparedStatement.setBytes(i, baos.toByteArray());
    

    也就是说,这是一种很好的气味。您确定需要将 Java 对象序列化到数据库中吗?这样,它们就无法索引且无法搜索。例如,如果您将每个序列化的Person 存储在数据库中,则您不能再执行SELECT * FROM person WHERE name = 'John'。通常的做法是对实体和数据库表进行 1:1 映射。例如,Date 可以完美地存储在 DATETIME/TIMESTAMP 列中。

    【讨论】:

    • 我绝对知道这不是一个好习惯,在我看来这不是不知道这种编程方式的理由:-)
    • 好吧,假设你知道自己在做什么:) 不客气。
    【解决方案2】:
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    
    ObjectOutputStream os = new ObjectOutputStream(bos);
    os.writeObject(new Date());
    os.close();
    
    byte[] data = bos.toByteArray();
    

    所以现在你有了一个字节数组,可以用它做你想做的事。

    【讨论】:

      【解决方案3】:

      您特别需要使用输出流来写入数据库吗?在尝试编写输出流实现之前,我会认真考虑查看持久性 api。因为连接细节等可能难以管理。

      查看link text 并记住它也可以在 J2SE 中使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-22
        • 2020-10-27
        • 1970-01-01
        • 2014-01-14
        • 1970-01-01
        • 2013-11-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多