2

我有一个可以通过各种方法和各种格式接收数据的应用程序。我有可插入的接收器,它们以某种方式获取数据(例如,通过轮询邮箱、侦听 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该字段的合适类型是什么?Object? InputStream? Byte[]?

4

4 回答 4

7

多种可能性:

  • 字节[]
    • 最直接的方法
  • 字节缓冲区
    • 灵活的
    • 具有随机访问和批量操作
    • 具有复制、切片等操作
    • 如果 IO/网络密集型 (NIO) 更可取
  • 输入流
    • 如果操作正确,则允许流水线操作
    • 不支持随机访问或批量操作。
    • 不如 ByteBuffer 灵活。

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

于 2009-07-15T15:42:17.590 回答
4

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

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

于 2009-07-15T15:34:23.957 回答
0

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

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

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

于 2009-07-15T15:40:14.100 回答
0

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

对您来说最简单的实现可能是ByteArrayResource封装了一个 byte[]。如果它变得太大,那么稍后您可以切换到类似 aFileSystemResource或 aURLResource或 Spring 提供的各种其他实现之一。但是由于您总是与 Resource 接口通信,因此您的客户端代码不应更改太多。

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

于 2009-07-15T15:44:08.927 回答