Получить файл из Main.class.getResource () - PullRequest
1 голос
/ 18 декабря 2011

Я делаю небольшую игру на Java.Для этой игры я просто добавил звуки ... Так что я хочу / хочу, чтобы все мои изображения и аудио были в банке.Для изображений это было легко:

new ImageIcon(Main.class.getResource("images/machgd2.png")).getImage()

Но для аудио я получаю его, когда запускаю программу в затмении, но не из банки, я использую:

File soundFile = new File(Main.class.getResource(filename).getFile());

Так какя получил этот файл из .jar-файла?

ОК, все заработало, благодаря Эндрю!Чтобы воспроизвести звук, я использовал класс, который нашел в сети, и обнаружил, что этот класс просто использует File для получения AudioInputStream, поэтому я отбросил файл File ..

Ответы [ 2 ]

4 голосов
/ 18 декабря 2011

Когда он находится в jar-файле, он не является файлом в файловой системе, не так ли? Вам нужно либо скопировать файл из файла JAR во какое-то временное местоположение, либо использовать API, для которых файл не требуется (например, те, которые требуют только InputStream или URL и то, и другое легко получить из файлов JAR, используя getResourceAsStream или getResource.).

Вы не показали, где вы используете soundFile - если вы покажете нам, какие API вы пытаетесь использовать, мы можем попытаться предложить подходящую альтернативу.

3 голосов
/ 18 декабря 2011

См. "Воспроизведение Clip" со страницы информации Java Sound здесь, чтобы увидеть ..

import java.net.URL;
import javax.swing.*;
import javax.sound.sampled.*;

public class LoopSound {

    public static void main(String[] args) throws Exception {
        URL url = new URL(
            "http://pscode.org/media/leftright.wav");
        Clip clip = AudioSystem.getClip();
        // getAudioInputStream() also accepts a File or InputStream
        AudioInputStream ais = AudioSystem.
            getAudioInputStream( url );
        clip.open(ais);
        // loop continuously
        clip.loop(-1);
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                // A GUI element to prevent the Clip's daemon Thread
                // from terminating at the end of the main()
                JOptionPane.showMessageDialog(null, "Close to exit!");
            }
        });
    }
}

Который, как вы могли заметить, использует URL (как возвращено getResource()), а не File. Метод перегружен, чтобы также принимать File или InputStream, но я чаще всего использую версию на основе URL.

...