Java 如何将ZipInputStream转换为InputStream?
我有代码,其中ZipInputSream被转换为字节[],但我不知道如何将其转换为inputstreamJava 如何将ZipInputStream转换为InputStream?,java,inputstream,zipinputstream,Java,Inputstream,Zipinputstream,我有代码,其中ZipInputSream被转换为字节[],但我不知道如何将其转换为inputstream private void convertStream(String encoding, ZipInputStream in) throws IOException, UnsupportedEncodingException { final int BUFFER = 1; @SuppressWarnings("unused") int count = 0
private void convertStream(String encoding, ZipInputStream in) throws IOException,
UnsupportedEncodingException
{
final int BUFFER = 1;
@SuppressWarnings("unused")
int count = 0;
byte data[] = new byte[BUFFER];
while ((count = in.read(data, 0, BUFFER)) != -1)
{
// How can I convert data to InputStream here ?
}
}
ZipInputStream是InputStream的一个子类
private InputStream convertZipInputStreamToInputStream(ZipInputStream in, ZipEntry entry, String encoding) throws IOException
{
final int BUFFER = 2048;
int count = 0;
byte data[] = new byte[BUFFER];
ByteArrayOutputStream out = new ByteArrayOutputStream();
while ((count = in.read(data, 0, BUFFER)) != -1) {
out.write(data);
}
InputStream is = new ByteArrayInputStream(out.toByteArray());
return is;
}
ZipInputStream
允许直接读取ZIP内容:使用getnextery()
迭代,直到找到要读取的条目,然后从ZipInputStream
读取
如果您不想只读取ZIP内容,但在进入下一步之前需要对流应用额外的转换,那么可以使用和。想法与此类似(从内存中编写,甚至可能无法编译):
下面是我如何解决这个问题的。现在我可以将ZipInputStream中的单个文件作为InputStream保存到内存中
private InputStream convertZipInputStreamToInputStream(ZipInputStream in, ZipEntry entry, String encoding) throws IOException
{
final int BUFFER = 2048;
int count = 0;
byte data[] = new byte[BUFFER];
ByteArrayOutputStream out = new ByteArrayOutputStream();
while ((count = in.read(data, 0, BUFFER)) != -1) {
out.write(data);
}
InputStream is = new ByteArrayInputStream(out.toByteArray());
return is;
}
邮政编码相当简单,但我在将ZipInputStream作为Inputstream返回时遇到了问题。出于某种原因,zip中包含的某些文件中的字符被删除。下面是我的解决方案,到目前为止,它一直在发挥作用
private Map<String, InputStream> getFilesFromZip(final DataHandler dhZ,
String operation) throws ServiceFault
{
Map<String, InputStream> fileEntries = new HashMap<String, InputStream>();
try
{
DataSource dsZ = dhZ.getDataSource();
ZipInputStream zipIsZ = new ZipInputStream(dhZ.getDataSource()
.getInputStream());
try
{
ZipEntry entry;
while ((entry = zipIsZ.getNextEntry()) != null)
{
if (!entry.isDirectory())
{
Path p = Paths.get(entry.toString());
fileEntries.put(p.getFileName().toString(),
convertZipInputStreamToInputStream(zipIsZ));
}
}
}
finally
{
zipIsZ.close();
}
}
catch (final Exception e)
{
faultLocal(LOGGER, e, operation);
}
return fileEntries;
}
private InputStream convertZipInputStreamToInputStream(
final ZipInputStream in) throws IOException
{
ByteArrayOutputStream out = new ByteArrayOutputStream();
IOUtils.copy(in, out);
InputStream is = new ByteArrayInputStream(out.toByteArray());
return is;
}
private Map getFilesFromZip(最终数据处理程序dhZ,
字符串操作)抛出ServiceFault
{
Map fileEntries=newhashmap();
尝试
{
DataSource dsZ=dhZ.getDataSource();
ZipInputStream zipIsZ=新的ZipInputStream(dhZ.getDataSource()
.getInputStream());
尝试
{
ZipEntry入口;
而((entry=zipIsZ.getNextEntry())!=null)
{
如果(!entry.isDirectory())
{
Path p=Path.get(entry.toString());
fileEntries.put(p.getFileName().toString(),
将ZipInputStream转换为InputStream(zipIsZ));
}
}
}
最后
{
zipIsZ.close();
}
}
捕获(最终异常e)
{
本地故障(记录器、e、操作);
}
返回文件条目;
}
私有InputStream转换器将PinPInputStream转换为InputStream(
最终ZipInputStream in)引发IOException
{
ByteArrayOutputStream out=新建ByteArrayOutputStream();
IOUtils.copy(输入、输出);
InputStream is=newbytearrayinputstream(out.toByteArray());
回报是;
}
请查看下面的函数示例,该函数将从ZIP存档中提取所有文件。此功能不适用于子文件夹中的文件:
private static void testZip() {
ZipInputStream zipStream = null;
byte buff[] = new byte[16384];
int readBytes;
try {
FileInputStream fis = new FileInputStream("./test.zip");
zipStream = new ZipInputStream(fis);
ZipEntry ze;
while((ze = zipStream.getNextEntry()) != null) {
if(ze.isDirectory()) {
System.out.println("Folder : "+ze.getName());
continue;//no need to extract
}
System.out.println("Extracting file "+ze.getName());
//at this moment zipStream pointing to the beginning of current ZipEntry, e.g. archived file
//saving file
FileOutputStream outFile = new FileOutputStream(ze.getName());
while((readBytes = zipStream.read(buff)) != -1) {
outFile.write(buff, 0, readBytes);
}
outFile.close();
}
} catch (Exception e) {
System.err.println("Error processing zip file : "+e.getMessage());
} finally {
if(zipStream != null)
try {
zipStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
你到底想干什么?解压流中的单个条目?是的,如果可能的话,我希望流中的单个文件作为InputStream。是否可以重复?请指定ZipEntry条目、字符串编码的使用位置以及原因?您应该避免这样做,这将导致大文件上的OutOfMemory错误。相反,您可以只使用ZipInputStream。看看第二个和第三个参数是什么?它们根本不被使用。while((count=in.read(buffer))>0){out.write(buffer,0,count);}正如ExtremeCoder所指出的,ZipInputStream是一个InputStream,或者如果您更喜欢“private InputStream ConvertZipInputStream到InputStream(ZipInputStream-in){return in;}”而不是所要求的。