用于在 Java 中根据 Blob 的内容创建文件的代码段

2022-09-02 21:04:27

我有一些文件存储在Oracle 9的数据库blob列中。

我想将这些文件存储在文件系统中。

这应该很容易,但我没有找到正确的截图。

我该如何在Java中执行此操作?

 PreparedStatement ptmst = ...
 ResutlSet rs = pstmt.executeQuery();
 rs.getBlob();
 // mistery 
 FileOutputStream out = new FileOutputStream();
 out.write(); // etc et c

我知道它应该是这样的东西...我不知道的是被评论为迷雾的东西

谢谢

编辑

我终于从大卫的问题中得出了这个结论。

这是我的懒惰实现:

PreparedStatement pstmt = connection.prepareStatement("select BINARY from MYTABLE");
ResultSet rs = pstmt.executeQuery();
while( rs.next() ) {
    Blob blob = rs.getBlob("BINARY");
    System.out.println("Read "+ blob.length() + " bytes ");
    byte [] array = blob.getBytes( 1, ( int ) blob.length() );
    File file = File.createTempFile("something-", ".binary", new File("."));
    FileOutputStream out = new FileOutputStream( file );
    out.write( array );
    out.close();
}

答案 1

你希望将 Blob 作为输入流获取,并将其内容转储到输出流。所以“痛苦”应该是这样的:

Blob blob = rs.getBlob(column);
InputStream in = blob.getBinaryStream();
OutputStream out = new FileOutputStream(someFile);
byte[] buff = new byte[4096];  // how much of the blob to read/write at a time
int len = 0;

while ((len = in.read(buff)) != -1) {
    out.write(buff, 0, len);
}

如果你发现自己做了很多这样的IO工作,你可能会考虑使用Apache Commons IO来处理细节。然后,设置流后的所有内容都将是:

IOUtils.copy(in, out);

答案 2

还有另一种方法可以更快地执行相同的操作。实际上,上面的答案工作正常,但就像大型文档需要花费大量时间一样。原因是你尝试按 4KB 迭代写入 blob。简化的解决方案:IOUtils.copy(in,out)

Blob blob = rs.getBlob(column);
InputStream in = blob.getBinaryStream();
OutputStream out = new FileOutputStream(someFile);
byte[] buff = blob.getBytes(1,(int)blob.getLength());
out.write(buff);
out.close();

输出流将一次性写入 blob。

编辑

很抱歉,在初始帖子上没有看到“编辑”部分。


推荐