从 jar 文件复制目录

2023-11-23

我最近开发了一个应用程序并创建了 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);
}

不幸的是这不起作用。

我尝试了以下方法但没有运气:

  • 使用 Streams 解决类似的问题 在其他课程上但不起作用 与目录。代码类似于http://www.exampledepot.com/egs/java.io/CopyFile.html

  • 使用以下命令创建文件模板new File(getClass().getResource("template").toUri())

在写这篇文章时,我正在考虑不要在资源路径中放置一个带有 zip 文件的模板目录。通过这种方式,我可以将文件作为输入流并将其解压缩到我需要的位置。但我不确定这是否是正确的方法。


感谢您的解决方案!对于其他类,以下不使用辅助类(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 许可证,但您可以在没有库的情况下在代码中使用此方法。但是,如果有许可证问题,我不承担任何责任。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 jar 文件复制目录 的相关文章

随机推荐

  • MongoDB - 使用 C# 驱动程序按日期和时间搜索

    您好 我想使用 MongoDB 的 C 驱动程序查找两个日期 带时间 之间的条目 但我使用的 Find Filter 方法会忽略时间并仅按日期搜索 我认为 我究竟做错了什么 My POCO public class TestClassFor
  • 使用 Gradle 运行 Karma?

    我有 Jasmine 单元测试 我想运行它并获取伊斯坦布尔代码覆盖率报告 我可以运行命令行脚本来在 Jenkins 中运行 Karma 但最好使用我的 build gradle 执行所有内容 是否可以使用 Gradle 运行 Karma 我
  • “异步”是否在单独的线程中运行? [复制]

    这个问题在这里已经有答案了 当我调用 foo 时 该方法是否在单独的线程上运行 public async Task
  • C# 中两个问号在一起意味着什么?

    遇到了这行代码 FormsAuth formsAuth new FormsAuthenticationWrapper 这两个问号是什么意思 是某种三元运算符吗 在谷歌上很难查到 它是空合并运算符 非常类似于三元 立即 if 运算符 也可以看
  • var myArray =[], 名称;?

    下面的语句中 name 有什么作用 var myArray name 我通常按 如下方式初始化数组 var myArray 它是简写 var myArray var name 这是关于个人喜好
  • 在树枝中循环并在三次迭代后中断

    我有以下树枝代码 for likeditem in user getItemLikes iterate over each liked items here endfor 但是我只想迭代前 3 项user getItemLikes 我该怎么
  • 与界面交互?

    从我读到的内容看来 人们可以与界面进行交互 例如 假设我有一个带有空方法 eat 的接口 然后有2个子类正在实现这个接口 我的控制器可以仅与界面交互并使用它的 eat 方法吗 看看这个链接中的图片strategy 除了访问其中定义的任何常量
  • 使用 Python 和 Numpy 创建原始图像的图像图块 (m*n)

    我正在使用 numpy 从 16 位 tiff 图像 13777 16004 创建 224 224 的图块 我能够沿着行和列裁剪 切片成 224 224 的相等图块 我在尝试创建新的图块时遇到了问题 移动图块大小的一半 例如 我想要实现的粗
  • Alamofire 与 -d

    我需要像邮递员那样提出请求 但是在阿拉莫菲尔 curl X DELETE http someUrl H authorization JWT someToken H cache control no cache H content type
  • 如何在 HTML 中将一个文本区域嵌入到另一个文本区域内?

    有没有办法将一个文本区域块嵌入另一个文本区域块内 但不渲染内部文本区域并保留外部文本区域 我无法修改内部文本区域 也许有比文本区域更适合外部块的东西 我需要一些可以在 POST 提交其内容的东西 将内部尖括号转换为实体是not一个选项 因为
  • tomcat安全约束影响缓存

    我在缓存我的应用程序时遇到问题 当此代码添加到 tomcat 的 web xml 时
  • Android - 如何获取 Spinner 中的所有项目?

    如何获得 Spinner 中的所有物品 我在尝试寻找一种方法来获取所有项目时遇到了麻烦Spinner但我无法找到一个优雅的解决方案 唯一的解决方案似乎是在将其添加到之前存储项目列表Spinner 还有其他更好的方法吗 一个简单而优雅的方法是
  • Android、Ormlite、数据库位置

    我正在使用 Ormlite 保存 Android 应用程序 在 Motorola Xoom 上运行 中的一些数据 默认情况下 sql数据库保存到 data data 包名 databases dbname db 问题是 Xoom 没有 ro
  • 为什么 noreturn/__builtin_unreachable 会阻止尾调用优化

    我发现 如果被调用函数不返回 即标记为 Noreturn noreturn 或者有一个 builtin unreachable 通话后 这是有意为之的行为 而不是错过的优化 如果是的话 为什么 示例1 ifndef cplusplus de
  • 使用 JAXB 从 JSON 解组嵌套对象

    我正在尝试使用 Eclipselink 将输入 JSON 解组到 JAXB 对象中 然而 当我尝试这样做时 我发现嵌套对象最终被设置为空 我可以尝试自行解组嵌套对象 并且它将一直工作 直到它必须解组进一步的嵌套对象 然后该对象也设置为 nu
  • 当 UDP 标头校验和不正确时,UDP 数据包是否会被丢弃?

    如果我打开一个原始套接字 并发送带有错误校验和的 udp 数据包 这些数据包是否会被 tcp ip 堆栈丢弃到另一侧 是的 它们会被丢弃 如果您需要更可靠的通信 那么使用 TCP 会更好 欲了解更多信息 请看一下 http www diff
  • handler.postDelayed 在 IntentService 的 onHandleIntent 方法中不起作用

    final Handler handler new Handler LOG d delay handler postDelayed new Runnable Override public void run LOG d notify cal
  • 何时为不再拥有的资源回收存储?

    下面程序的第 2 行分配了一个向量资源 当程序结束时 向量资源不被拥有 如果资源根本不被拥有 那么什么时候会回收它 是否有使用 Rust 所有权语义和生命周期术语的解释可以让程序员相信该资源确实被回收了 fn main let mut v
  • psql中,为什么有些命令没有效果?

    有时我的命令在psql似乎没有效果 知道为什么吗 以下是数据库中所有表的列表library development library development gt d List of relations Schema Name Type Ow
  • 从 jar 文件复制目录

    我最近开发了一个应用程序并创建了 jar 文件 我的一个类创建一个输出目录 用其资源中的文件填充它 我的代码是这样的 Copy files from dir template in this class resource to output