Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从java.sql.Blob类型的zip文件中读取和提取zip条目,而不将FileInputStream或filepath作为java字符串_Java_Oracle_Plsql_Blob_Zipinputstream - Fatal编程技术网

如何从java.sql.Blob类型的zip文件中读取和提取zip条目,而不将FileInputStream或filepath作为java字符串

如何从java.sql.Blob类型的zip文件中读取和提取zip条目,而不将FileInputStream或filepath作为java字符串,java,oracle,plsql,blob,zipinputstream,Java,Oracle,Plsql,Blob,Zipinputstream,我试图将一个zip文件(zip)作为java.sql.Blob从pl/sql传递给java方法,并读取zip文件中的文件名和内容。我希望将它们作为Zip条目检索,然后将它们插入到oracle数据库中的临时表中。但问题是,当我将blob转换为字节数组时,它不会将其作为zip条目。返回null。任何解决方案都会非常受欢迎。这是一个比仅zip文件更通用的解决方案(而且Java的原生zip支持并不处理所有zip格式) 使用来加载及其依赖项: (根据需要更新新版本) 然后,您可以在数据库中创建Java源:

我试图将一个zip文件(zip)作为java.sql.Blob从pl/sql传递给java方法,并读取zip文件中的文件名和内容。我希望将它们作为Zip条目检索,然后将它们插入到oracle数据库中的临时表中。但问题是,当我将blob转换为字节数组时,它不会将其作为zip条目。返回null。任何解决方案都会非常受欢迎。

这是一个比仅
zip
文件更通用的解决方案(而且Java的原生zip支持并不处理所有zip格式)

使用来加载及其依赖项:

(根据需要更新新版本)

然后,您可以在数据库中创建Java源:

创建或替换并编译名为UNZIP AS的JAVA源代码
导入java.io.IOException;
导入java.io.InputStream;
导入java.sql.Connection;
导入java.sql.SQLException;
导入java.util.ArrayList;
导入org.apache.commons.compress.archivers.ArchiveException;
导入org.apache.commons.compress.archivers.ArchiveInputStream;
导入org.apache.commons.compress.archivers.ArchiveStreamFactory;
导入org.apache.commons.compress.archivers.ArchiveEntry;
导入oracle.jdbc.driver.OracleDriver;
导入oracle.sql.ARRAY;
导入oracle.sql.ArrayDescriptor;
导入oracle.sql.BLOB;
导入org.apache.commons.compress.compressors.CompressorException;
导入org.apache.commons.compress.compressors.CompressorStreamFactory;
公共类解压{
公共静态数组列表文件(
最终BLOB文件
)
抛出java.sql.SQLException
{
最终ArrayList文件=新ArrayList();
if(file!=null&&file.length()>0)
{
ArchiveInputStream ais=null;
尝试
{
InputStream=file.binaryStreamValue();
试一试{
stream=新的CompressorStreamFactory().createCompressorInputStream(流);
}
catch(压缩异常e){}
ais=新ArchiveStreamFactory().createArchiveInputStream(流);
档案中心入口;
而((entry=ais.getnextery())!=null)
{
if(entry.isDirectory()| | entry.getSize()==0)
继续;
add(entry.getName());
}
}
捕获(ArchiveException e){
add(“错误:+e.getMessage());
}
捕获(IOE异常){
add(“错误:+e.getMessage());
}
最后
{
尝试{if(ais!=null)ais.close();}catch(IOException e){}
}
}
最终字符串[]fs=新字符串[files.size()];
文件。toArray(fs);
最终连接连接=新OracleDriver().defaultConnection();
返回新数组(
ArrayDescriptor.createDescriptor(“SYS.ODCIVARCHAR2LIST”,康涅狄格州),
康涅狄格州,
财政司司长
);      
}
公共静态BLOB解压(
最终BLOB文件,
最终字符串路径
)
抛出java.sql.SQLException
{
ArchiveInputStream ais=null;
BLOB extractedFile=null;
连接conn=null;
if(file!=null&&file.length()>0&&path!=null)
{
试一试{
InputStream=file.binaryStreamValue();
试一试{
stream=新的CompressorStreamFactory().createCompressorInputStream(流);
}
catch(压缩异常e){}
ais=新ArchiveStreamFactory().createArchiveInputStream(流);
档案中心入口;
而((entry=ais.getnextery())!=null){
如果(!entry.getName().equals(path))
继续;
最终字节[]字节=新字节[8096];
长pos=1;
内伦;
conn=新的OracleDriver().defaultConnection();
extractedFile=BLOB.createTemporary(conn,false,BLOB.DURATION\u调用);
而((len=ais.read(bytes))>0){
extractedFile.setBytes(位置,字节,0,len);
pos+=len;
}
打破
}
}
捕获(最终归档例外e){}
捕获(最终IOE){}
最后
{
尝试{if(ais!=null)ais.close();}catch(final IOException e){}
尝试{if(conn!=null)conn.close();}catch(final SQLException e){}
}
}
返回提取的文件;
}
}
/
显示错误;
/
(根据需要添加适当的异常处理代码。)

然后可以创建包装函数,以便从数据库调用代码:

创建或替换函数解压列表文件(
块状拉链
)
返回SYS.ODCIVARCHAR2LIST
作为JAVA语言
名称“Unzip.listFiles(oracle.sql.BLOB)return oracle.sql.ARRAY”;
/
显示错误;
/
创建或替换函数解压(
成团的zipfile,
VARCHAR2中的文件路径
)
返回斑点
作为JAVA语言
名称“Unzip.Unzip(oracle.sql.BLOB,java.lang.String)return oracle.sql.BLOB”;
/
显示错误;
/
然后,您可以使用它们插入到新表中:

将解压的文件(文件路径,文件)插入您的\u表中
选择n.COLUMN\u值,
解压(t.your\u blob,n.COLUMN\u值)
从压缩文件的\u表\u
交叉连接表(解压列表文件(t.your\u blob))n
public static void unzipFiles(java.sql.Blob zip) throws Exception{
 String paths = "";
 byte[] blobAsBytes = zip.getBytes(1, (int) zip.length());
 ZipInputStream zis = new ZipInputStream(zip.getBinaryStream(), StandardCharsets.UTF_8);
 ZipEntry zipEntry = null;
 while ((zipEntry = zis.getNextEntry()) != null) {
      paths=zipEntry.getName()+" ";
 }
 Connection conn = DriverManager.getConnection("jdbc:default:connection:");
 String sql = "INSERT INTO E (FILENAME) VALUES (:paths)";
 PreparedStatement pstmt = conn.prepareStatement(sql);
 pstmt.setString(1, paths);
 pstmt.executeUpdate();}
loadjava -user USERNAME/PASSWORD@SID xz.jar commons-compress-1.10.jar