Ошибка при перемещении класса в другой пакет

261
21 августа 2018, 03:40

Есть метод проигрывания аудиоформата.

 public void soundClick(){
        try {
            clipClick = AudioSystem.getClip();
            InputStream input = new BufferedInputStream(getClass().getResourceAsStream("click1.wav"));
            AudioInputStream ais = AudioSystem.getAudioInputStream(input);
            clipClick.open(ais);
            clipClick.start();
            ais.close();
        } catch (LineUnavailableException e) {
            e.printStackTrace();
            JOptionPane.showMessageDialog(null,"Помилка під час програвання аудіо (1)");
            e.printStackTrace();
        } catch (UnsupportedAudioFileException e) {
            e.printStackTrace();
            JOptionPane.showMessageDialog(null,"Помилка під час програвання аудіо (2)");
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
            JOptionPane.showMessageDialog(null,"Помилка під час програвання аудіо (3)");
            e.printStackTrace();
        }

Все нормально работало, до тех пор пока я не переместил класс с этим методом в другой пакет. Теперь при воспроизведении звука выдает ошибку.

java.io.IOException: Stream closed
    at java.io.BufferedInputStream.getInIfOpen(BufferedInputStream.java:159)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:265)
    at com.sun.media.sound.RIFFReader.read(RIFFReader.java:125)
    at com.sun.media.sound.RIFFReader.<init>(RIFFReader.java:60)
    at com.sun.media.sound.WaveFloatFileReader.internal_getAudioFileFormat(WaveFloatFileReader.java:65)
    at com.sun.media.sound.WaveFloatFileReader.getAudioFileFormat(WaveFloatFileReader.java:55)
    at com.sun.media.sound.WaveFloatFileReader.getAudioInputStream(WaveFloatFileReader.java:117)
    at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1113)
    at com.pav.avdonin.server.Server.soundClick(Server.java:926)
    at com.pav.avdonin.server.Server$3.actionPerformed(Server.java:1096)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6533)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
    at java.awt.Component.processEvent(Component.java:6298)
    at java.awt.Container.processEvent(Container.java:2237)
    at java.awt.Component.dispatchEventImpl(Component.java:4889)
    at java.awt.Container.dispatchEventImpl(Container.java:2295)
    at java.awt.Component.dispatchEvent(Component.java:4711)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4889)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4526)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4467)
    at java.awt.Container.dispatchEventImpl(Container.java:2281)
    at java.awt.Window.dispatchEventImpl(Window.java:2746)
    at java.awt.Component.dispatchEvent(Component.java:4711)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90)
    at java.awt.EventQueue$4.run(EventQueue.java:731)
    at java.awt.EventQueue$4.run(EventQueue.java:729)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Почему поток закрыт?

Answer 1

В javadoc'е к методу Class#getResourceAsStream(String name) описан алгоритм поиска файла, путь к которому передается в виде параметра name. Подробно этот алгоритм уже разбирали тут. Хоть там и рассматривался метод getResource(), принцип остается тот же. В итоге, что же мы имеем: достаточно исправить путь к ресурсу.

InputStream input = new BufferedInputStream(getClass().getResourceAsStream("/click1.wav"));
READ ALSO
Ошибка в простейшем калькуляторе

Ошибка в простейшем калькуляторе

В простом калькуляторе, где я перемножаю два числа у меня выходит ошибкаЯ не знаю как можно исправить

207
Hibernate search &amp; elasticsearch

Hibernate search & elasticsearch

Кто-нибудь встречался с такой ошибкой при работе с Hibernate Search (Elasticsearch):

192
Ошибка при загрузке ListView

Ошибка при загрузке ListView

Учусь работать с DrawerLayoutПри запуске приложения возникает следующая ошибка

237
Чтение файла возле JAR

Чтение файла возле JAR

В одном каталоге с jar-файлом лежит properties файл, который нужно прочитатьСейчас открываю файл так

202