Java 如何将ZipInputStream转换为InputStream?

Java 如何将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

我有代码,其中ZipInputSream被转换为字节[],但我不知道如何将其转换为inputstream

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;}”而不是所要求的。