我知道有很多方法可以做到这一点,但是我在这项任务中遇到了问题,我无法通过我已经找到的解决方案解决这些问题。
首先,我不想读取jar中的特定文件:我想阅读所有目录里面 jar中包含的文件给定目录的路径。 也就是说,通过一些研究,我发现了如何做到这一点,我写了一个测试代码。
public class StringLocalizer {
private final List<URL> files;
public StringLocalizer(final String stringsDirectory) throws URISyntaxException, IOException {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
final BufferedReader br = new BufferedReader(new InputStreamReader(loader.getResourceAsStream(stringsDirectory), StandardCharsets.UTF_8));
files = br.lines()
.map(l -> stringsDirectory + "/" + l)
.map(loader::getResource)
.collect(Collectors.toList());
// This line has the debug purpose of showing all the url contained in the list
System.out.println(Arrays.toString(files.toArray(new URL[files.size()])));
}
public static void main(String[] args) {
try {
new StringLocalizer("test/testDirectory/");
} catch (URISyntaxException | IOException e) {
e.printStackTrace();
}
}
}
首先,我在IDE(Eclipse)中尝试了代码,然后得到了这个输出:
[file:/C:/Users/*my_user_name*/neon/workspace/JavaStringLocalizer/bin/test/testDirectory//test.xml]
代码运行良好,这是我的第一个想法,但是当我尝试将程序打包在一个可运行的JAR文件中时,我得到了一个意外的输出:
[]
为什么即使文件打包在JAR文件中,列表也是空的?
(正确的输出应该是包含给定目录中所有文件的数组的表示,如第一个输出)
编辑: 为了更好地了解我的情况,我有这些文件:
>MyJar.jar
>classFiles
>test>testDirectory>test.xml // I want to get this file
注意:此目录将包含更多文件,因此我不想静态访问它们但我想动态读取所有文件
编辑:
使用ZipFile
提取文件的代码:
public class StringLocalizer {
private final List<ZipEntry> files = new ArrayList<ZipEntry>();
public StringLocalizer(final String stringsDirectory) throws URISyntaxException, IOException {
URL jarUrl = getClass().getProtectionDomain().getCodeSource().getLocation();
File jarFile = new File(jarUrl.toURI().getPath());
ZipFile unzipper = new ZipFile(jarFile, ZipFile.OPEN_READ);
ZipEntry dirEntry = unzipper.getEntry(stringsDirectory);
Enumeration<? extends ZipEntry> entries = unzipper.entries();
for(ZipEntry entry = entries.nextElement(); entries.hasMoreElements(); entry = entries.nextElement()) {
if(entry.getName().startsWith(dirEntry.getName()) && !entry.getName().equals(dirEntry.getName())) {
files.add(entry);
}
System.out.println(entry.getName());
}
System.out.println(Arrays.toString(files.toArray(new ZipEntry[files.size()])));
unzipper.close();
}
public static void main(String[] args) {
try {
new StringLocalizer("test/testDirectory/");
} catch (URISyntaxException | IOException e) {
e.printStackTrace();
}
}
}
为什么忽略最后一个条目?