gpt4 book ai didi

java - 从 jar 文件中复制目录

转载 作者:IT老高 更新时间:2023-10-28 21:00:32 24 4
gpt4 key购买 nike

我最近开发了一个应用程序并创建了 jar 文件。

我的一个类创建了一个输出目录,并用其资源中的文件填充它。

我的代码是这样的:

// Copy files from dir "template" in this class resource to output.
private void createOutput(File output) throws IOException {

File template = new File(FileHelper.URL2Path(getClass().getResource("template")));
FileHelper.copyDirectory(template, output);
}

很遗憾,这不起作用。

我尝试了以下没有运气:

在写这篇文章时,我在考虑不要在资源路径中有一个模板目录,而不是一个包含它的 zip 文件。这样做我可以将文件作为 inputStream 并将其解压缩到我需要的地方。但我不确定这是否正确。

最佳答案

感谢您的解决方案!对于其他人,以下不使用辅助类(StringUtils 除外)

/我为这个解决方案添加了额外的信息,检查代码末尾,Zegor V/

public class FileUtils {
public static boolean copyFile(final File toCopy, final File destFile) {
try {
return FileUtils.copyStream(new FileInputStream(toCopy),
new FileOutputStream(destFile));
} catch (final FileNotFoundException e) {
e.printStackTrace();
}
return false;
}

private static boolean copyFilesRecusively(final File toCopy,
final File destDir) {
assert destDir.isDirectory();

if (!toCopy.isDirectory()) {
return FileUtils.copyFile(toCopy, new File(destDir, toCopy.getName()));
} else {
final File newDestDir = new File(destDir, toCopy.getName());
if (!newDestDir.exists() && !newDestDir.mkdir()) {
return false;
}
for (final File child : toCopy.listFiles()) {
if (!FileUtils.copyFilesRecusively(child, newDestDir)) {
return false;
}
}
}
return true;
}

public static boolean copyJarResourcesRecursively(final File destDir,
final JarURLConnection jarConnection) throws IOException {

final JarFile jarFile = jarConnection.getJarFile();

for (final Enumeration<JarEntry> e = jarFile.entries(); e.hasMoreElements();) {
final JarEntry entry = e.nextElement();
if (entry.getName().startsWith(jarConnection.getEntryName())) {
final String filename = StringUtils.removeStart(entry.getName(), //
jarConnection.getEntryName());

final File f = new File(destDir, filename);
if (!entry.isDirectory()) {
final InputStream entryInputStream = jarFile.getInputStream(entry);
if(!FileUtils.copyStream(entryInputStream, f)){
return false;
}
entryInputStream.close();
} else {
if (!FileUtils.ensureDirectoryExists(f)) {
throw new IOException("Could not create directory: "
+ f.getAbsolutePath());
}
}
}
}
return true;
}

public static boolean copyResourcesRecursively( //
final URL originUrl, final File destination) {
try {
final URLConnection urlConnection = originUrl.openConnection();
if (urlConnection instanceof JarURLConnection) {
return FileUtils.copyJarResourcesRecursively(destination,
(JarURLConnection) urlConnection);
} else {
return FileUtils.copyFilesRecusively(new File(originUrl.getPath()),
destination);
}
} catch (final IOException e) {
e.printStackTrace();
}
return false;
}

private static boolean copyStream(final InputStream is, final File f) {
try {
return FileUtils.copyStream(is, new FileOutputStream(f));
} catch (final FileNotFoundException e) {
e.printStackTrace();
}
return false;
}

private static boolean copyStream(final InputStream is, final OutputStream os) {
try {
final byte[] buf = new byte[1024];

int len = 0;
while ((len = is.read(buf)) > 0) {
os.write(buf, 0, len);
}
is.close();
os.close();
return true;
} catch (final IOException e) {
e.printStackTrace();
}
return false;
}

private static boolean ensureDirectoryExists(final File f) {
return f.exists() || f.mkdir();
}
}

它只使用了一个来自 Apache Software Foundation 的外部库,但是使用的函数只有:

  public static String removeStart(String str, String remove) {
if (isEmpty(str) || isEmpty(remove)) {
return str;
}
if (str.startsWith(remove)){
return str.substring(remove.length());
}
return str;
}
public static boolean isEmpty(CharSequence cs) {
return cs == null || cs.length() == 0;
}

我的知识仅限于 Apache 许可证,但您可以在没有库的代码中使用此方法。但是,如果存在许可问题,我概不负责。

关于java - 从 jar 文件中复制目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1386809/

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