如何使用Java将每个文件存储在一个zip存档中的阵列中?

如何使用Java将每个文件存储在一个zip存档中的阵列中?,java,arrays,compiler-construction,zip,archive,Java,Arrays,Compiler Construction,Zip,Archive,理想情况下,我只想读取zip归档文件,并将每个文件存储在一个准备编译的Iterable中。(假设zip仅包含.java文件) 类似这样的东西会很好,但这不起作用,因为我无法获得zip中每个文件的路径 private ArrayList<String> javaFilePaths = new ArrayList<String>(); Iterable<? extends JavaFileObject> = fileManager.getJavaFileObjec

理想情况下,我只想读取zip归档文件,并将每个文件存储在一个准备编译的Iterable中。(假设zip仅包含.java文件)

类似这样的东西会很好,但这不起作用,因为我无法获得zip中每个文件的路径

private ArrayList<String> javaFilePaths = new ArrayList<String>();
Iterable<? extends JavaFileObject> = fileManager.getJavaFileObjectsFromStrings(javaFilePaths);
private ArrayList javafilepath=new ArrayList();

Iterable您可以扫描ZIP文件并保留对其条目的引用。然后从列表中选择条目,提取文件并对其执行任何需要执行的操作。最初不必完全读取所有文件。一个缺点是:在处理完ZIP存档文件之前,不能调用
ZipFile.close()

例如:

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;

public class SO {
    static class ZipFileRecord {
        final ZipFile zf;
        final ZipEntry ze;

        public ZipFileRecord(ZipFile zf, ZipEntry ze) {
            super();
            this.zf = zf;
            this.ze = ze;
        }

        public String content() throws IOException {
            InputStream is = zf.getInputStream(ze);
            BufferedReader br = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
            StringBuilder sb = new StringBuilder();
            String line = null;
            int count = 5;  // limit loop for reduced output
            while ((line = br.readLine())!=null) {
                sb.append(line);
                sb.append("\n");
                if (count--<=0) {
                    sb.append("...\n");
                    break;
                }
            }
            br.close();
            return sb.toString();
        }
    }
    public static class ZipWalker {
        final ArrayList<ZipFileRecord> list = new ArrayList<>();
        ZipFile zf;

        public void scan(String fn) throws ZipException, IOException {
            File f = new File(fn);
            if (!f.exists()) throw new RuntimeException("File not found: " + f);
            zf = new ZipFile(f);
            Enumeration<? extends ZipEntry> entries = zf.entries();
            for (ZipEntry ze : Collections.list(entries)) {
                if (ze.getName().endsWith(".java")) {
                    list.add(new ZipFileRecord(zf, ze));
                }
            }
        }

        public void dump() throws IOException {
            int count = 3;  // limit loop for reduced output
            for (ZipFileRecord fr : list) {
                System.out.println("=============> " + fr.ze);
                System.out.println(fr.content());
                if (count--<=0)
                    break;
            }
            zf.close();
        }
    }
    public static void main(String[] args) throws ZipException, IOException {
        ZipWalker zw = new ZipWalker();
        zw.scan("path/to/your/file.zip");
        zw.dump();
    }
}
导入java.io.BufferedReader;
导入java.io.File;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入java.nio.charset.charset;
导入java.util.ArrayList;
导入java.util.Collections;
导入java.util.Enumeration;
导入java.util.zip.ZipEntry;
导入java.util.zip.ZipException;
导入java.util.zip.ZipFile;
公开课{
静态类ZipFileRecord{
最终ZipFile zf;
最后的ZipEntry-ze;
公共ZipFile记录(ZipFile zf、ZipPentry ze){
超级();
这是zf=zf;
this.ze=ze;
}
公共字符串内容()引发IOException{
InputStream is=zf.getInputStream(ze);
BufferedReader br=新的BufferedReader(新的InputStreamReader(is,Charset.forName(“UTF-8”));
StringBuilder sb=新的StringBuilder();
字符串行=null;
int count=5;//减少输出的限制循环
而((line=br.readLine())!=null){
某人附加(行);
某人附加(“\n”);

如果(count--我就快到了,不管FileOutputStream如何创建文件,我都可以在之后删除它,但是有没有办法不用创建文件,而是让它成为虚拟的?请评论我的答案

btnBrowse.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                int returnVal = fileChooser.showOpenDialog(null);
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    try {
                        isZip = true;
                        ZipFile zipFile = new ZipFile(fileChooser.getSelectedFile());
                        Enumeration<?> enu = zipFile.entries();
                        while (enu.hasMoreElements()) {
                            ZipEntry zipEntry = (ZipEntry) enu.nextElement();
                            File file = new File(zipEntry.getName());
                            InputStream is = zipFile.getInputStream(zipEntry);
                            FileOutputStream fos = new FileOutputStream(file);
                            byte[] bytes = new byte[1024];
                            int length;
                            while ((length = is.read(bytes)) >= 0) {
                                fos.write(bytes, 0, length);
                            }
                            is.close();
                            fos.close();
                            fileArrayList.add(file);
                        }
                        zipFile.close();
                    } catch (IOException ioe) {
                        ioe.printStackTrace();
                    }
                }
            }
        });
btnBrowse.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
int returnVal=fileChooser.showOpenDialog(null);
if(returnVal==JFileChooser.APPROVE_选项){
试一试{
isZip=true;
ZipFile ZipFile=新ZipFile(fileChooser.getSelectedFile());
枚举enu=zipFile.entries();
而(enu.hasMoreElements()){
ZipEntry ZipEntry=(ZipEntry)enu.nextElement();
File File=新文件(zipEntry.getName());
InputStream is=zipFile.getInputStream(zipEntry);
FileOutputStream fos=新的FileOutputStream(文件);
字节[]字节=新字节[1024];
整数长度;
而((长度=is.read(字节))>=0){
fos.写入(字节,0,长度);
}
is.close();
fos.close();
添加(文件);
}
zipFile.close();
}捕获(ioe异常ioe){
ioe.printStackTrace();
}
}
}
});

我会按照你的要求对你的答案发表评论,但评论的篇幅有限。 可以实现您想要的:编译源代码,而不实际将其解压缩到文件系统上的物理文件中

引用接口的API

此文件管理器创建表示常规文件、zip文件条目或类似基于文件系统的容器中的条目的文件对象

在谷歌搜索时,我发现了以下文章:

在“Java编译:概念和实现”一节中,它对“源文件”作了如下说明:

要编译的一个或多个.java源文件。JavaFileManager提供一个抽象文件系统,将源文件名和输出文件名映射到JavaFileObject实例。(此处,文件表示唯一名称和字节序列之间的关联。客户端不需要使用实际的文件系统。

以下文章也做了同样的事情:

两者都使用CharSequence作为编译源。
您可以尝试根据上述文章中的解释构建自己的实现,并将其更改为基于ZipEntry只需使用其中一篇文章中的实现来编译它。

不确定您要做什么,但请看一下
java.util.zip.ZipInputStream
@orid I“think”我需要遍历zip文件,并将每个.java文件作为
文件
对象存储在数组/类型列表中
文件
您不应该“思考”。你应该知道你需要什么和想问什么。你不能将
ZipEntry
存储为.java文件,因为这些文件可能包含字节码,除非你确定它是一个
JarInputStream
,其中包含一些工件sources@A.J对不起,我不是Java大师,我不懂所有的东西。这就是我来这里的原因很多经验。我知道一般的概念,但我不知道如何编程。主要的概念是,用户浏览包含Java文件的zip存档,然后将Java文件临时存储在内存中,然后编译生成类文件。除了如何从z存储文件外,我的一切都正常工作将ip文件夹放入数组中。请查看我的答案,并建议您是否有任何想法?:)我想我已经开始理解了