在Java中将非常大的Blob对象(大约3GB)转换为bytearray

在Java中将非常大的Blob对象(大约3GB)转换为bytearray,java,blob,Java,Blob,我已经浏览了几个网站,其中显示了将java.sql.Blob对象转换为byte[]并最终保存为文件的示例代码 e、 g。 或 大多数建议使用blob.getBytes(pos,length) 即 byte[]blobBytes=blob.getBytes(1,(int)blob.length() 但是,如果blob的大小超过整数的最大值(例如3 GB),则blobBytes对象将被截断,并且创建的文件格式将不正确 有没有办法克服它的尺寸限制 或者我必须使用blob.getBinaryStrea

我已经浏览了几个网站,其中显示了将
java.sql.Blob
对象转换为
byte[]
并最终保存为文件的示例代码

e、 g。 或

大多数建议使用
blob.getBytes(pos,length)
byte[]blobBytes=blob.getBytes(1,(int)blob.length()

但是,如果blob的大小超过整数的最大值(例如3 GB),则
blobBytes
对象将被截断,并且创建的文件格式将不正确

有没有办法克服它的尺寸限制


或者我必须使用
blob.getBinaryStream(1,blob.length())
来获取InputStream并进一步将其处理为byte[]?

最简单的方法是使用ApacheIOutils(您需要将其包含在项目中)并将流复制到磁盘

InputStream blobInputStream = blob.getBinaryStream();
OutputStream fileOutputStream = new FileOutputStream(new File("/path/to/file.out"));
IOUtils.copyLarge(blobInputStream, fileOutputStream);
copyLarge(InputStream输入,OutputStream输出)从 大(超过2GB)输入流到输出流


编辑:您也可以使用blob.getBytes,但您需要在循环中一次提取合理数量的字节(例如8192),然后写入FileOutputStream。

Oracle提供了一种从
Oracle.sql.blob
获取inputstram的方法:

见:


为什么您甚至想要3 GB的内存?所以-是的-您应该流式处理数据,并且只处理部分数据。而且-是的-这就是
getBinaryStream
方法的用途。您使用哪个数据库?@Berger,我使用的是Oracle DB。我检查了blob大小是否可以支持4GB-1。@请参见LenVirtuse,我的问题来自一个代码扫描结果,该结果突出显示我将一个'long'向下转换为'int',该值在
blob.getBytes(1,(int)blob.length()中使用。这是我的应用程序API中的一个方法,它假设从DB读取一个blob并将其作为字节[]输出。我假设您建议的方法是blob.getBinaryStream(long pos,long length)?实际上,我只是想知道InputStream是否是处理此类大Blob对象的唯一方法,以便我可以决定如何修改API。谢谢,我会接受这个答案,因为它指引我找到了我想要的正确答案。字节[]可以接受的最大大小为整数。代码超过上限时会出现异常,因此无法将3GB blob转换为字节[]。完全处理blob的唯一方法是使用InputStream。谢谢