【问题标题】:URI not hierarchical need to use File class for a methodURI 不分层需要使用 File 类作为方法
【发布时间】:2026-01-10 13:55:01
【问题描述】:

我需要用我的代码打开一个视频文件,它在 Eclipse 中运行良好,但是当我导出到可运行的 JAR 时,我收到一个错误“URI 不是分层的”。

我看到有人建议使用 getResourceAsStream(),但我需要有一个文件对象,因为我使用的是 Desktop.getDesktop.open(File)。谁能帮帮我?

代码如下:

try {
    URI path1 = getClass().getResource("/videos/tutorialVid1.mp4").toURI();
    File f = new File(path1);

    Desktop.getDesktop().open(f);
} catch (Exception e) {
    e.printStackTrace();
}

如果它有助于我的文件夹列表就像

    • 视频
      • videoFile.mp4

编辑: 我打算只在 Windows 上运行它,并使用 launch4j 创建一个 exe。

【问题讨论】:

  • jar 文件中的资源不是文件。它不在文件系统中。所以你不能使用 File 来引用它,因为它不是一个文件。
  • 我可以使用其他方法吗? b/c 我所关心的是能够在不使用外部 API 或 JMF 的情况下播放视频。
  • 不要将视频放入jar文件中。将它与您的应用程序捆绑在一起,但在 jar 文件之外。或者从 jar 文件中读取它,将其复制到一个临时文件中,然后打开该临时文件。
  • 你能链接到第二个例子吗?请和谢谢你
  • 您为什么不直接在 Google 上搜索“如何在 Java 中创建临时文件”?无需我的帮助,您将获得大量链接。

标签: java


【解决方案1】:

您可以将文件从 jar 复制到一个临时文件并打开它。

以下是为给定 jar 资源创建临时文件的方法:

public static File createTempFile(String path) {
    String[] parts = path.split("/");
    File f = File.createTempFile(parts[parts.length - 1], ".tmp");
    f.deleteOnExit();
    try (Inputstream in = getClass().getResourceAsStream(path))  {
        Files.copy(in, f.toPath(), StandardCopyOption.REPLACE_EXISTING);
    }
    return f;
}

下面是你如何使用它的一个例子:

Desktop.getDesktop().open(createTempFile("/videos/tutorialVid1.mp4"));

【讨论】:

  • 使用 .mp4 代替 .tmp 也可以吗?还是危险/不好的做法?
  • @shadowforce100 是的,那也可以。
  • 我只是注意到由于某种原因临时文件没有被删除,所以 StandardCopyOption.REPLACE_EXISTING 需要是第三个参数。固定
  • 你确定它没有被删除吗?对 deleteOnExit 的调用应该让 JVM 在关机时删除文件。