我正在从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”时将其保存在物理上我想直接将其保存在数据库中?可能吗 ?怎么做?
提前致谢。
答案 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文件字节的内存中的字节数组。
像在将任何类型的数据插入数据库表中一样创建预准备语句,并使用其ByteArrayOutputStream
或setBinaryStream()
方法使用字节数组的内容填充其中一列。您只需要将setBlob()
(使用字节数组构造为参数)传递给其中一种方法。