gpt4 book ai didi

Java - 读取jar中的文件

转载 作者:行者123 更新时间:2023-11-30 10:39:07 25 4
gpt4 key购买 nike

我知道有很多方法可以做到这一点,但是我在这个任务中遇到了我无法用我已经找到的解决方案解决的问题。

首先,我不想读取 jar 中的特定文件:我想读取所有目录中包含的文件inside给定目录的路径。也就是说,通过一些研究,我发现了如何执行此操作并编写了测试代码。

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();
}
}

}

为什么最后一个条目被忽略了?

最佳答案

JAR 文件实际上是 ZIP 文件,因此只需将文件视为 ZIP 文件即可,例如@Jamie。建议。

关于Java - 读取jar中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39419135/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com