2

我正在从 url 读取 zip 文件,现在我想将它直接保存到数据库,而不是使用 java 和 hibernate 物理存储它。

我正在阅读 zip 文件,

    URLConnection  uCon = null;
    URL Url;
    byte[] buf;     
    ZipOutputStream outStream = new ZipOutputStream(new FileOutputStream("mytest.zip"));
    Url= new URL(http://xyz.com/pages/info.doc);
    uCon = Url.openConnection();
    is = uCon.getInputStream();
    buf = new byte[size];
    is = uCon.getInputStream();
    outStream.putNextEntry(new ZipEntry("info.doc"));
    while ((ByteRead = is.read(buf)) != -1) 
              {     
    outStream.write(buf, 0, ByteRead);
    ByteWritten += ByteRead;
    }
    is.close();
    outStream.close();

我不想在创建“mytest.zip”后物理保存它我想直接将它保存在数据库中?可能吗 ?怎么做?

提前致谢。

4

2 回答 2

2

是的,这是可能的。写入 aByteArrayOutputStream而不是写入 a FileOutputStream。使用 的getBytes()方法ByteArrayOutputStream在内存中获取字节数组,其中包含 zip 文件的字节。

创建一个准备好的语句,就像将任何类型的数据插入到数据库表中一样,并使用它的setBinaryStream()orsetBlob()方法用字节数组的内容填充其中一个列。您只需要将ByteArrayInputStream(以字节数组作为参数构造)传递给这些方法之一。

于 2012-06-30T17:34:42.687 回答
2

使用管道来保持低内存需求 - setBlob(colunm, InputStream) - 并使用 IOUtils.copy 进行快速复制。

    PipedOutputStream pipeOut = new PipedOutputStream();
    PipedInputStream pipeIn = new PipedInputStream(pipeOut);

    setBlob(pipeIn);

    ZipOutputStream zipOut = new ZipOutputStream(pipeOut, Charset.forName("UTF-8"));
    zipOut.putNextEntry(new ZipEntry("info.doc"));
    IOUtils.copy(sourceIn, zipOut); // org.apache.commons.io.IOUtils;
    zipOut.closeEntry();
    zipOut.close();

这仍然没有trys,第二个线程会很好。

于 2012-06-30T19:13:29.023 回答