首页 文章

来自ZipInputStream的ZipEntry的getInputStream(不使用ZipFile类)

提问于
浏览
22

如何在不使用 ZipFile 类的情况下从 ZipInputStream 获取 ZipEntryInputStream

3 回答

  • 18

    它以这种方式工作

    static InputStream getInputStream(File zip, String entry) throws IOException {
        ZipInputStream zin = new ZipInputStream(new FileInputStream(zip));
        for (ZipEntry e; (e = zin.getNextEntry()) != null;) {
            if (e.getName().equals(entry)) {
                return zin;
            }
        }
        throw new EOFException("Cannot find " + entry);
    }
    
    public static void main(String[] args) throws Exception {
        InputStream in = getInputStream(new File("f:/1.zip"), "launch4j/LICENSE.txt");
        Scanner sc = new Scanner(in);
        while(sc.hasNextLine()) {
            System.out.println(sc.nextLine());
        }
        in.close();
    }
    
  • 16

    呃, ZipInputStream 已经 InputStream. 你不需要另一个 . 获取下一个 ZipEntry 将流放在条目的开头 . 见Javadoc .

  • 0

    要返回稍后可以使用的输入流列表,我使用了以下内容

    public static List<InputStream> listResourcesInJar(URL jar) throws IOException{
        ZipInputStream zipInputStream = new ZipInputStream(jar.openStream());
        ZipEntry zipEntry = null;
    
        List<InputStream> inputStreams = new ArrayList<>();
    
        while ((zipEntry = zipInputStream.getNextEntry()) != null) {
            String entryName = zipEntry.getName();
            if (entryName.endsWith(".xsd")) {
                inputStreams.add(convertToInputStream(zipInputStream));
            }
        }
        return inputStreams;
    }
    
    private static InputStream convertToInputStream(final ZipInputStream inputStreamIn) throws IOException {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        IOUtils.copy(inputStreamIn, out);
        return new ByteArrayInputStream(out.toByteArray());
    }
    

相关问题