如何从一个“.zip”文件中读取所有“.java”文件

3

我想获取所有的.java文件并将它们放入一个文件ArrayList中。我已经使用ZipInputStreamZipEntry来遍历文件,但不知道如何从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<File>?它的目的是什么? - Pshemo
请查看此链接:link - nikli
我想获取Java文件的所有注释和标识符以检查代码异味。因此,我想从这个类中获取所有Java文件。然后使用这些文件(即获取注释和标识符以检查代码异味)。@Pshemo - Sharafat Ahmed Sabir
1
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
感谢您的澄清和提供的链接,这对我很有帮助。@Pshemo - Sharafat Ahmed Sabir
4个回答

6
这里是可以读取并打印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));
            }
        }
    }
}

谢谢。这非常有帮助。 - Sharafat Ahmed Sabir
但是由于我使用的是MultipartFile而不是ZipFile(尽管文件实际上是一个zip文件),你能告诉我如何从中获取字符串吗? - Sharafat Ahmed Sabir
1
你可以参考此链接 https://dev59.com/t2Af5IYBdhLWcg3wukpk - Abhishek Honey

0
请使用这段代码进行检查。
 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);
}

0

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

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

但是这样做将不会包含压缩文件中原始文件的内容。 - Sharafat Ahmed Sabir

0
如果您想要一个文件列表以便之后遍历,那么首先需要将文件提取到某个地方。其他答案中有如何获取输入流并将其写入磁盘的示例,因此我不会重复说明。
一旦您提取了文件,就可以使用对它们的引用来填充列表。
附言:我猜您这样做是为了某个项目或其他什么,但通常像Sonarqube这样的工具非常适合进行静态代码分析。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接