Запуск файла wmv, упакованного в банку

Я хочу выполнить видеофайл wmv, присутствующий в PicturePackage. я использую следующий код:

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. Но когда я запускаю его через сборку jar-файла с помощью netbeans, он не запускает видеофайл. Какая-то конкретная проблема, о которой я не забочусь???

РЕДАКТИРОВАТЬ:

я попробовал этот

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
}
}

И это трассировка стека, которую я получаю

Когда вы запускаете его из Netbeans, ваш файл wmv существует как отдельный независимый файл. Это может быть воспроизведено внешним видеоплеером.


person ashu    schedule 31.07.2014    source источник
comment
ага, проверял через 7zip. Видеофайл присутствует в файле jar   -  person Ko2r    schedule 31.07.2014
comment
Есть ли другой способ запустить файл в jar. Если нет, то как мы можем извлечь из банки??? Спасибо за беспокойство   -  person ashu    schedule 31.07.2014


Ответы (1)


Когда вы упаковываете свое приложение в банку и запускаете ее как банку, wmv будет упакован в банку, а созданный вами файл f будет ссылаться на эту запись в банке. Эта запись jar не будет доступна/интерпретируема для внешнего видеопроигрывателя.

Вы должны извлечь wmv, сохранить его как временный файл и открыть его. Или не включайте видеофайл в банку, поместите его рядом с банкой.

Вот как вы можете извлечь видео во временный файл:

Просто для вопроса, действительно ли ваше видео упаковано в файл 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
    }
}
person icza    schedule 31.07.2014
comment
Внешние видеоплееры обычно не поддерживают воспроизведение видеофайла, упакованного в zip или jar-файл, поэтому я бы на это не рассчитывал. Проще всего было бы не упаковывать видео в jar, а просто поместить его рядом с файлом jar. - person ashu; 31.07.2014
comment
Отредактировано, чтобы показать, как извлечь видео во временный файл. - person icza; 31.07.2014
comment
Не работает. Я использовал JoptionPane, чтобы получить исключение. Пишет Исключение FileAlreadyExist. Несмотря на то, что я удалил все файлы во временной папке - person icza; 31.07.2014
comment
_1_ создает уникальный несуществующий файл. Пожалуйста, опубликуйте свою трассировку стека, потому что мне неясно, где возникает исключение. - person ashu; 31.07.2014
comment
Как написать трассировку стека в комментариях. он позволяет использовать только 600 символов, а трассировка стека довольно велика... - person icza; 31.07.2014
comment
Добавьте его, например, в свой вопрос. - person ashu; 01.08.2014
comment
К вопросу добавлен полный вывод e.printstacktrace(). Я предполагаю, что проблема заключается в копировании файла, потому что временный файл уже создан во время createtempfile(). - person icza; 01.08.2014
comment
Я добавил Files.delete(temp); после строки пути Path, и он начинает работать. - person ashu; 01.08.2014
comment
А, теперь я знаю. Очевидно, что _1_ создает файл, поэтому мы должны указать _2_ перезаписать его с помощью опции: _3_. Отредактировано. - person ashu; 01.08.2014
comment
Спасибо, icza, это работает. Тем временем я нашел другой код и хочу знать, какой из них будет лучше - person icza; 01.08.2014
comment
Строка temppath= System.getProperty(user.home)+\\AppData\\Local\\Temp\\admin_input.wmv; InputStream in = getClass().getResourceAsStream(/PicturePackage/admin_input.wmv); Файл f = новый файл (temppath); попробуйте { OutputStream out = новый FileOutputStream (f); байт [] буфер = новый байт [4096]; int len ​​= in.read (буфер); в то время как (длина! = -1) { out.write (буфер, 0, длина); len = in.read (буфер); if (Thread.interrupted()) { throw new InterruptedException(); } } } - person ashu; 02.08.2014
comment
Мое решение проще и эффективнее, используйте мое. - person ashu; 02.08.2014
comment
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.Wind ow.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) - person icza; 02.08.2014