我用哪种类型来表示Java中的任意blob?

时间:2009-07-15 15:32:16

标签: java data-modeling

我有一个可以通过各种方法和各种格式接收数据的应用程序。我有可插拔的接收器以某种方式获取数据(例如,通过轮询邮箱,监听HTTP请求,观察目录的内容等),将其与MIME类型相关联,然后将其传递给包裹如下:

public class Transmission {
    private String origin;      // where the data came from
    private String destination; // where the data was sent to
    private String mime;        // the MIME type of the data
    private BLOB data;          // this is what I need an appropriate type for
}

更进一步,数据由专业处理程序根据mime字段的值进行处理。我期待像ZIP文件,Excel文档,SOAP,通用XML,纯文本等等。此时,代码应该与数据中的内容无关。 data字段的适当类型是什么? ObjectInputStreamByte[]

4 个答案:

答案 0 :(得分:7)

多种可能性:

  • 字节[]
    • 最直接的方式
  • ByteBuffer
    • 灵活
    • 具有随机访问和批量操作
    • 具有复制,切片等操作
    • 最好是IO /网络密集型(NIO)
  • InputStream
    • 如果操作正确
    • 允许流水线操作
    • 不支持随机访问或批量操作。
    • 不如ByteBuffer灵活。

我不会使用Blob,因为将与DB相关的东西放入我们的主模型似乎很奇怪。

答案 1 :(得分:4)

我会选择byte[]InputStream,因为它更灵活,所以更喜欢该流。如果需要,您可以使用ByteInputArrayStream为其提供一个字节数组。但你不能反过来这样做。

还有内存效率的好处,因为流可以处理大块外部数据而没有太多内存。如果使用byte[],则需要将所有数据加载到内存中。换句话说,流是懒惰的。

答案 2 :(得分:0)

在上面的课程中,我会将其设为 byte [] 。为什么不是java.sql.Blob?因此,您的Transmission对象与SQL(或数据存储区)无关。

e.g。您可能在某个阶段想要将其写为Javaspace,CouchDb或其他不是SQL数据库的东西。通过将其存储为字节数组,此信息是基本形式,您可以根据需要进行翻译。如果你的byte []真的很大,那么你的Transmission对象可以通过磁盘等来处理缓存。但我稍后会担心这个。

编辑:引用自旧答案(现已删除)建议的java.sql.Blob以来的SQL。不幸的是,一旦答案消失,它就会使这里的引用有些异常。

答案 3 :(得分:0)

就个人而言,我会使用Spring的Resource抽象。这为存在于某处的资源提供了更好的包装。它提供了在您想要使用资源时检索InputStream的方法。

最简单的实现可能是ByteArrayResource,它封装了一个byte []。如果它变得太大,那么稍后您可以切换到类似FileSystemResourceURLResource或Spring提供的各种其他实现之一。但由于您总是与资源界面交谈,因此您的客户端代码不应该改变太多。

此外,由于这只是Spring API中的一组实用程序类和接口,因此您可以单独使用Resource及其实现,而无需使用Spring中的任何其他内容。