Read directly a file within a Zip file - Java

后端 未结 3 1877
一个人的身影
一个人的身影 2020-12-19 12:31

My situation is that I have a zip file that contains some files (txt, png, ...) and I want to read it directly by their names, I have tested the following code but no result

相关标签:
3条回答
  • 2020-12-19 13:03

    What is the path of the test.txt within the zip file? You need to use the path within the zip file to read this file. Also make sure that your zipfile is in the classpath. In fact, you can bundle this in a jar file.

    0 讨论(0)
  • 2020-12-19 13:10

    If you can be sure that your zip file will never be packed inside another jar, you can use something like:

    URL zipUrl = Main.class.getResource("/resources/zipfile.zip");
    URL entryUrl = new URL("jar:" + zipUrl + "!/test.txt");
    InputStream is = entryUrl.openStream();
    

    Or:

    URL zipUrl = Main.class.getResource("/resources/zipfile.zip");
    File zipFile = new File(zipUrl.toURI());
    ZipFile zip = new ZipFile(zipFile);
    InputStream is = zip.getInputStream(zip.getEntry("test.txt"));
    

    Otherwise, your choices are:

    • Use a ZipInputStream to scan through the zip file once for each entry that you need to load. This may be slow if you have a lot of resources, unless you can reuse the same ZipInputStream for all your resources.
    • Don't pack the resources in a nested zip file, and just inline them in the jar with the code.
    • Copy the nested zip file into a temporary directory, and access it using the ZipFile class.
    0 讨论(0)
  • 2020-12-19 13:14

    Your current approach is definitely not going to work. You made up an arbitrary 'access' scheme and used it in a class that has no idea what you are trying to do. What you can do is use a ZipInputStream to read the entry you are looking for:

    URL zipFileURL = Thread.currentThread().getContextClassLoader().getResource("zipfile.zip");
    InputStream inputStream = zipFileURL.openStream();
    ZipInputStream zipInputStream = new ZipInputStream(inputStream);
    
    ZipEntry zipEntry = null;
    
    do {
        zipEntry = zipInputStream.getNextEntry();
        if(zipEntry == null) break;
    }
    while(zipEntry != null && (! "textfile".equals(zipEntry.getName()));
    
    if(zipEntry != null ) {
        // do some stuff
    }
    

    This is adhoc code, fix it up to do what you need. Also, there might be some more efficient classes to handle Zip files, for example in the Apache Commons IO library.

    0 讨论(0)
提交回复
热议问题