【问题标题】:Executing wmv file packaged in jar执行打包在jar中的wmv文件
【发布时间】:2014-09-23 01:13:45
【问题描述】:

我想执行 PicturePackage 中的 wmv 视频文件。 我正在使用以下代码:

try {
        File f;
        f = new File(getClass().getResource("/PicturePackage/admin_input.wmv").toURI());
        Desktop.getDesktop().open(f);
    } catch (URISyntaxException | IOException ex) {
        Logger.getLogger(Help.class.getName()).log(Level.SEVERE, null, ex);
    }

当我在 netbeans 中运行时,此代码会运行并播放视频。但是当我通过netbeans构建的jar文件执行它时,它不会运行视频文件。 任何我没有处理的具体问题???

编辑:

我试过这个

File tempFile = null;
try (InputStream in =
    getClass().getResourceAsStream("/PicturePackage/admin_input.wmv")) {
Path temp = Files.createTempFile("temp", ".wmv");
Files.copy(in, temp);
tempFile = temp.toFile();
// This will try to delete the file when you close your java app
tempFile.deleteOnExit(); 
} catch (Exception e) {
// Handle the exceptions properly
}

// Here you can use tempFile to open it
if (tempFile != null) {
try {
    Desktop.getDesktop().open(tempFile);
} catch (IOException e) {
    // Handle exception
}
}

这是我得到的堆栈跟踪

java.nio.file.FileAlreadyExistsException: C:\Users\Ashu\AppData\Local\Temp\temp1136027223125637051.wmv 在 sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:81) 在 sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97) 在 sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102) 在 sun.nio.fs.WindowsFileSystemProvider.newByteChannel(WindowsFileSystemProvider.java:230) 在 java.nio.file.spi.FileSystemProvider.newOutputStream(FileSystemProvider.java:430) 在 java.nio.file.Files.newOutputStream(Files.java:170) 在 java.nio.file.Files.copy(Files.java:2841) 在gatetestadmin.Help.jButton1ActionPerformed(Help.java:148) 在gatetestadmin.Help.access$000(Help.java:23) 在gatetestadmin.Help$1.actionPerformed(Help.java:63) 在 javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018) 在 javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341) 在 javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 在 javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 在 javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 在 java.awt.Component.processMouseEvent(Component.java:6505) 在 javax.swing.JComponent.processMouseEvent(JComponent.java:3320) 在 java.awt.Component.processEvent(Component.java:6270) 在 java.awt.Container.processEvent(Container.java:2229) 在 java.awt.Component.dispatchEventImpl(Component.java:4861) 在 java.awt.Container.dispatchEventImpl(Container.java:2287) 在 java.awt.Component.dispatchEvent(Component.java:4687) 在 java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) 在 java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492) 在 java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) 在 java.awt.Container.dispatchEventImpl(Container.java:2273) 在 java.awt.Window.dispatchEventImpl(Window.java:2719) 在 java.awt.Component.dispatchEvent(Component.java:4687) 在 java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735) 在 java.awt.EventQueue.access$200(EventQueue.java:103) 在 java.awt.EventQueue$3.run(EventQueue.java:694) 在 java.awt.EventQueue$3.run(EventQueue.java:692) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 在 java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) 在 java.awt.EventQueue$4.run(EventQueue.java:708) 在 java.awt.EventQueue$4.run(EventQueue.java:706) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 在 java.awt.EventQueue.dispatchEvent(EventQueue.java:705) 在 java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) 在 java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) 在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) 在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) 在 java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

【问题讨论】:

  • 只是问一下,你的视频真的打包进你的jar文件了吗?
  • 是的,我已经通过 7zip 进行了检查。视频文件存在于 jar 文件中

标签: java netbeans getresource


【解决方案1】:

当您从 Netbeans 运行它时,您的 wmv 文件作为单独的独立文件存在。这可以通过外部视频播放器播放。

当您将应用程序打包到 jar 中并作为 jar 运行时,wmv 将被打包到 jar 中,您创建的 f 文件将引用该 jar 条目。此 jar 条目将不可用于外部视频播放器/无法解释。

您必须提取 wmv,将其保存为临时文件并打开它。或者不要将视频文件包含在 jar 中,将其放在 jar 旁边。

将视频提取到临时文件的方法如下:

File tempFile = null;
try (InputStream in =
        getClass().getResourceAsStream("/PicturePackage/admin_input.wmv")) {
    Path temp = Files.createTempFile("temp", ".wmv");
    Files.copy(in, temp, StandardCopyOption.REPLACE_EXISTING);
    tempFile = temp.toFile();
    // This will try to delete the file when you close your java app
    tempFile.deleteOnExit(); 
} catch (Exception e) {
    // Handle the exceptions properly
}

// Here you can use tempFile to open it
if (tempFile != null) {
    try {
        Desktop.getDesktop().open(tempFile);
    } catch (IOException e) {
        // Handle exception
    }
}

【讨论】:

  • 有没有其他方法可以运行jar中的文件。如果没有,那我们如何从罐子中“提取”???感谢您的关心
  • 外部视频播放器通常不支持播放压缩在 zip 或 jar 文件中的视频文件,所以我不会指望它。最简单的方法是不要将视频打包到 jar 中,只需将其放在 jar 文件旁边即可。
  • 已编辑以显示如何将视频提取到临时文件。
  • 不工作。我使用 JoptionPane 来获取异常。它说 FileAlreadyExist 异常。尽管我删除了临时文件夹中的所有文件
  • Files.createTempFile() 生成一个唯一的、不存在的文件。请发布您的堆栈跟踪,因为我不清楚异常发生在哪里。
猜你喜欢
  • 2014-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-10
  • 2015-09-01
  • 2013-06-15
  • 1970-01-01
相关资源
最近更新 更多