【问题标题】:How to read all ".java" files from a ".zip" file如何从“.zip”文件中读取所有“.java”文件
【发布时间】:2018-02-23 08:50:30
【问题描述】:

我想获取所有.java 文件并将它们放入ArrayList 文件中。我用ZipInputStream 和ZipEntry 遍历文件,但不明白如何从ZipEntry 获取文件。

public List<File> getJavaFiles(MultipartFile file){
    List<File> javaFiles = new ArrayList<File>();

    ZipEntry zipEntry;

    log.info("getJavaFiles");
    try {
        ZipInputStream zip;
        try {
            zip = new ZipInputStream( file.getInputStream());
            while((zipEntry = zip.getNextEntry()) != null){
                if(zipEntry.getName().endsWith(".java")){
                    log.info(zipEntry.getName());

                    //How do I put the java file in my array list
                }
            }
            zip.close();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }


    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


    return javaFiles;
}

【问题讨论】:

  • 你想如何使用返回的List&lt;File&gt;?它的目的是什么?
  • 请检查这里link
  • 我想获取 java 文件的所有 cmets 和标识符来检查代码异味。所以我想从这个类中获取所有的java文件。然后使用这些文件(即获取 cmets 和标识符来检查代码异味)。 @Pshemo
  • File 描述文件的位置,如 zip 文件,而不是其条目。也许你想要 URI。访问“Get a File or URI object for a file inside an archive with Java?”和“Read directly a file within a Zip file - Java”了解更多信息。
  • 感谢您的澄清和链接。这很有帮助。 @Pshemo

标签: java zipfile


【解决方案1】:

这是可以读取和打印 zip 文件中的 .java 文件的代码::

您还可以使用此代码获取文件及其内容。

import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

import org.apache.commons.io.IOUtils;

public class test {
    public static void main(String[] args) throws IOException {
        ZipFile zipFile = new ZipFile("test.zip");
        Enumeration<? extends ZipEntry> entries = zipFile.entries();
        System.out.println(entries);

        while(entries.hasMoreElements()){
            ZipEntry entry = entries.nextElement();
            System.out.println(entry.getName());
            if(entry.getName().contains("java")){
                InputStream stream = zipFile.getInputStream(entry);
                System.out.println(IOUtils.toString(stream, StandardCharsets.UTF_8));
            }
        }
    }
}

【讨论】:

  • 谢谢。这很有帮助。
  • 但是由于我使用的是 MultipartFile 而不是 ZipFile(虽然该文件实际上是一个 zip 文件),你能告诉我如何从中获取字符串吗?
【解决方案2】:

也许你可以像下面这样直接使用文件:

File javaFile = new File(zipEntry.getName());
javaFiles.add(javaFile); 

【讨论】:

  • 但这不会有 zip 文件中文件的原始内容
【解决方案3】:

请检查此代码

 ZipFile zipFile = new ZipFile("C:/test.zip");

Enumeration<? extends ZipEntry> entries = zipFile.entries();

while(entries.hasMoreElements()){
    ZipEntry entry = entries.nextElement();
    InputStream stream = zipFile.getInputStream(entry);
}

【讨论】:

    【解决方案4】:

    如果您想要稍后将遍历的文件列表,那么首先您需要在某处提取文件。其他答案有如何获取输入流然后将其写入磁盘的示例,因此我不会重复。

    提取文件后,您可以使用对它们的引用来填充列表。

    附言我猜你是为一个项目或其他东西做这个,但一般来说,像 Sonarqube 这样的工具非常适合静态代码分析。

    【讨论】:

      猜你喜欢
      • 2010-12-23
      • 2021-12-15
      • 1970-01-01
      • 2014-10-13
      • 1970-01-01
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多