代码之家  ›  专栏  ›  技术社区  ›  OscarRyz

从Java中的BLB内容创建文件的片段

  •  15
  • OscarRyz  · 技术社区  · 16 年前

    我在Oracle9的数据库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();
    }
    
    2 回复  |  直到 9 年前
        1
  •  20
  •   David Winslow    16 年前

    您希望将blob作为inputstream获取,并将其内容转储到outputstream。所以“痛苦”应该是这样的:

    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
  •  1
  •   j0k gauthamp    12 年前

    还有另一种方法可以更快地执行相同的操作。实际上,上面的答案很好,但像 IOUtils.copy(in,out) 大文件要花很多时间。原因是您正试图通过4KB迭代编写blob。更简单的解决方案:

    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。

    编辑

    抱歉,在最初的帖子上没有看到编辑部分。

    推荐文章