是否可以保存从http读取的zip文件,并直接将其保存到Databse,而无需在Java中进行物理创建

时间:2012-06-30 17:24:23

标签: java database hibernate url zip

我正在从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”时将其保存在物理上我想直接将其保存在数据库中?可能吗 ?怎么做?

提前致谢。

2 个答案:

答案 0 :(得分: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();

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

答案 1 :(得分:1)

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

像在将任何类型的数据插入数据库表中一样创建预准备语句,并使用其ByteArrayOutputStreamsetBinaryStream()方法使用字节数组的内容填充其中一列。您只需要将setBlob()(使用字节数组构造为参数)传递给其中一种方法。