我有一个可以通过各种方法和各种格式接收数据的应用程序。我有可插拔的接收器以某种方式获取数据(例如,通过轮询邮箱,监听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[]
?
答案 0 :(得分:7)
多种可能性:
我不会使用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 []。如果它变得太大,那么稍后您可以切换到类似FileSystemResource
或URLResource
或Spring提供的各种其他实现之一。但由于您总是与资源界面交谈,因此您的客户端代码不应该改变太多。
此外,由于这只是Spring API中的一组实用程序类和接口,因此您可以单独使用Resource及其实现,而无需使用Spring中的任何其他内容。