2014-05-23 2 views
0

У меня проблема с моим дорожком аудиофайла.Проблемы с адресом с банком

Когда я компилирую проект аудио звучит хорошо, но когда я открываю банку он дает мне эту ошибку (я undestand ошибки, но я не могу видеть, что я делаю неправильно ...):

Извините, если на испанском языке «No existe el archivo o el directorio» означает «Нет такого файла или каталога существует».

/home/user1/NetBeansProjects/project1/dist/project1.jar!/music/2.wav Исключение в потоке "Thread-0" java.lang.IllegalStateException: java.io.FileNotFoundException:/Главная/user1 /NetBeansProjects/project1/dist/project1.jar!/music/2.wav (No existe el archivo o el directorio) at logic.AudioFilePlayer.run (AudioFilePlayer.java:54) Вызвано: java.io.FileNotFoundException: /home/user1/NetBeansProjects/project1/dist/project1.jar!/music/2.wav (не существует эль archivo o el directorio) на java.io.FileInputStream.open (собственный метод) на java.io.FileInputStream . (FileInputStream.java:146) на com.sun.media.sound.WaveFloatFileReader.getAudioInputStream (WaveFloatFileReader.java:164) на javax.sound.sampled.AudioSystem.getAudioInputStream (AudioSystem.java:1179) в logic.AudioFilePlayer.run (AudioFilePlayer.java:36)

А вот код:

boolean loop = true; 
private final URL url = getClass().getResource("/music/2.wav"); 
private final String convertFilePath = url.toString(); 
String filePath = convertFilePath.substring(convertFilePath.lastIndexOf("file:") + 5); 

@Override 
public void run() { 
    while (loop == true) { 
     final File file = new File(filePath); 
     System.out.println(filePath); 
     try (final AudioInputStream in = getAudioInputStream(file)) { 

      final AudioFormat outFormat = getOutFormat(in.getFormat()); 
      final Info info = new Info(SourceDataLine.class, outFormat); 

      try (final SourceDataLine line 
        = (SourceDataLine) AudioSystem.getLine(info)) { 

       if (line != null) { 
        line.open(outFormat); 
        line.start(); 
        stream(getAudioInputStream(outFormat, in), line); 
        line.drain(); 
        line.stop(); 
       } 
      } 

     } catch (UnsupportedAudioFileException | LineUnavailableException | IOException e) { 
      throw new IllegalStateException(e); 
     } 
    } 
} 

private AudioFormat getOutFormat(AudioFormat inFormat) { 
    final int ch = inFormat.getChannels(); 
    final float rate = inFormat.getSampleRate(); 
    return new AudioFormat(PCM_SIGNED, rate, 16, ch, ch * 2, rate, false); 
} 

private void stream(AudioInputStream in, SourceDataLine line) 
     throws IOException { 
    final byte[] buffer = new byte[4096]; 
    for (int n = 0; n != -1; n = in.read(buffer, 0, buffer.length)) { 
     line.write(buffer, 0, n); 
    } 
} 
+0

Является ли звуковой файл в файле jar? Если это так, вы должны использовать другие средства для чтения файла. – NESPowerGlove

+0

@NESPowerGlove Да, он включен, а также изображения, они попадают в комплекте, когда проект скомпилирован в их собственной папке, но по какой-то причине они отлично работают, за исключением аудиофайла:/ –

+0

Вы также используете объект File загружать изображения? Если изображения собраны в банке, убедитесь, что вы случайно не загружаете одинаковые изображения, которые также существуют в вашей файловой системе. Если вы правильно загружаете изображения из фляги, вы знаете правильный метод, который вам нужно использовать для получения потока звукового файла из банки. – NESPowerGlove

ответ

1

Когда работая с JAR, вы должны обрабатывать URL-адрес jar:file вместо того, чтобы манипулировать им и пытаться самостоятельно создать объект File. Вы должны передать URL-адрес, который вы получаете от getResource, прямо к конструктору, если он его поддерживает.

// get the URL of the file as usual 
URL url = getClass().getResource("/music/2.wav"); 

// get stream directly from URL, which could be a file or a jar:file 
AudioInputStream in = getAudioInputStream(url); 

Если это не работает, и ваша библиотека может принимать входной поток, вы можете попробовать использовать ClassLoader#getResourceAsStream и передать в соответствующие конструкторы/методов.

В противном случае вы можете попробовать извлечь файл где-нибудь локально, а затем передать путь к этому файлу.

Я предполагаю, что некоторые библиотеки просто не поддерживают загрузку файлов из JAR при предоставлении URL-адреса (с протоколом jar:file).

+0

OH! вы правы ... Я мог бы попробовать это ... но для тестирования, что он работает, я должен как создать одну папку с песней в src, так и другую в рамках моего проекта? Чтобы проверить оба проекта/jar –

+0

Это дало мне несколько идей о том, что я могу попробовать, спасибо большое! AudioInputStream in = getAudioInputStream (url); <- Сложил ту же ошибку, поэтому я предполагаю, что ввод/вывод песни сделает трюк. –

Смежные вопросы