理想情况下,我只想读取 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/