Музыкальный файл отлично работает, когда я передаю URI, но он не работает, когда я передаю строковый путь. Почему?

#java #file

#java #файл

Вопрос:

Я создаю игру в стиле DJ MAX.

Я пытаюсь установить фоновую музыку для главного экрана игры, но здесь я обнаружил проблему.

Когда я передаю путь к файлу в виде URI или строки для создания экземпляра файлового объекта, оба работают нормально.

Однако, когда я пытаюсь подключить объект File к FileInputStream, объект File, у которого есть строковый путь, не работает (ФАЙЛ URI РАБОТАЕТ ИДЕАЛЬНО). Возникает ошибка, в которой говорится: «Система не может найти указанный путь». Я проверял несколько раз, но путь правильный.

Есть ли какая-либо причина, по которой я должен передавать путь к файловому классу в качестве URI?

Спасибо за вашу поддержку

Атрибуты

     public class Music extends Thread {
        private Player player;
        private boolean isLoop;
        private File file;
        private FileInputStream fis;
        private BufferedInputStream bis;
  

Передача пути в виде строки: не работает

    public Music(String name, boolean isLoop) {
            try {
                this.isLoop = isLoop;
                file = new File("../musics/adventuresHimitsu.mp3");         
                fis = new FileInputStream(file);        
                bis = new BufferedInputStream(fis);
                player = new Player(bis);
            }catch(Exception e) {
                System.out.println(e.getMessage());
            }
        }
  

Появилось сообщение об ошибке:
..musics adventuresHimitsu.mp3 (система не может найти указанный путь)
null

Передача пути в виде URI: Работает

     public Music(String name, boolean isLoop) {
    try {
        this.isLoop = isLoop;
        file = new File(Main.class.getResource("../musics/adventuresHimitsu.mp3").toURI());         
        fis = new FileInputStream(file);        
        bis = new BufferedInputStream(fis);
        player = new Player(bis);
    }catch(Exception e) {
        System.out.println(e.getMessage());
    }
}
  

Комментарии:

1. потому что, когда вы указали новый файл, вы должны указать полный путь (абсолютный). Когда вы загружаете его из ресурса, он загружается из текущего класса, поэтому путь относительно пути.

2. Первый фрагмент пытается найти файл в файловой системе, используя путь, который относится к текущему каталогу, то есть каталогу, из которого была выполнена java команда. Второй фрагмент пытается загрузить ресурс из classpath, загруженный загрузчиком классов, используя недопустимый путь. Они делают совершенно разные вещи. Вам нужно решить, что ваш код должен выполнять: загружать файл в файловой системе или загружать ресурс, связанный с вашим приложением (обычно внутри файла jar вашего приложения). Если последнее, прочитайте javadoc Class.getResource.

3. Кроме того, если последнее, поймите, что ресурс classpath — это не файл, и поэтому вам НЕ следует использовать file IO для его чтения, поскольку, как только вы действительно создадите свое приложение, ресурс будет расположен внутри файла jar вашего приложения, а не в файловой системе.

4. Что сказал JB Nizet. Используйте Main.class.getResourceAsStream("../musics/adventuresHimitsu.mp3") и вообще не используйте File или FileInputStream.

5. @VGR нет, потому что ../musics/adventuresHimitsu.mp3 не является допустимым путем для getResourceAsStream().