java - 如何使用 Java 将每个文件存储在 zip 存档中的数组中?

标签 java arrays compiler-construction zip archive

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

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

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

是否可以将 ArrayList 的每个元素作为存档中文件的路径?到目前为止,我只能浏览 zip 存档并获取所有无用的文件名,因为当我调用 getJavaFileObjectsFromStrings(javaFilePaths); 时,它不会是文件的完整路径。也许我需要先将每个文件的内容存储在一个新的 JavaFileObject 中?真的不确定解决这个问题的最佳方法......

有人可以帮忙解决这个问题吗,事实证明这非常棘手!

更新:

考虑将 zip 存档中的每个文件作为 File 对象存储在 File 类型的数组中

然后调用getJavaFileObjectsFromFiles(arrayOfFiles);方法。

解决方案、想法?

最佳答案

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

引用接口(interface)API StandardJavaFileManager

This file manager creates file objects representing regular files, zip file entries, or entries in similar file system based containers

在谷歌搜索我发现了以下文章:Create dynamic applications with javax.tools

在“Java 编译:概念和实现”部分中,它对“源文件”进行了以下说明:

one or more .java source files to compile. JavaFileManager provides an abstract file system that maps source and output file names to JavaFileObject instances. (Here, file means an association between a unique name and a sequence of bytes. The client doesn't need to use an actual file system.)

下面的文章也做了同样的事情:Dynamic in-memory compilation

两者都使用 CharSequence 作为编译源。 您可以尝试根据上面文章中的说明构建自己的实现,并更改为基于 ZipEntry。否则,您可以将 zip 条目的内容(正如您提到的,您知道它是一个 java 源文件)读取到 StringBuffer 中,然后使用其中一篇文章中的实现来编译它。

关于java - 如何使用 Java 将每个文件存储在 zip 存档中的数组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15769502/

相关文章:

java - 如何使用 junit 和 easymock 模拟静态方法

java - 多屏幕java小程序的按钮不起作用

在 C 中检查结构数组是否为 'empty'

java - 如何抛出 StackOverflowException

javascript - 在 Svelte3 和 Javascript 中,如何将复杂的计算数组返回给我的箭头函数?

C# 字典初始化程序编译不一致

java - 比较两个数组,增加计数器

java - Java applet 可以充当服务器吗?

PHP 运算符优先级错误?

c++ - 有限状态机编译器