在.jar导出中使用.mid文件

时间:2019-01-28 23:32:04

标签: java

我正在和一些使用Netbeans的朋友一起开发基于文本的RPG。它在Netbeans中都能正常工作,但当我将其导出到.jar文件时,出现此错误。

2019年1月28日2:27:15 PM Operator.DragonsHead startActionPerformed 严重:null java.io.FileNotFoundException:文件“ src \ Operator \ files \ Opening.mid”不存在!

这种情况发生在游戏开始时,因为我们在启动时会播放一个“主题”。 这首歌在Netbeans上播放,但在导出时不播放。

我是Java编程的新手,去年我参加了课程。

我曾尝试在网上寻找同样问题的人,但我无法完全将其与我的代码重复。

这是中产阶级:

import javax.sound.midi.*;
import java.io.File;
import java.io.IOException;
import java.io.FileNotFoundException;

public class MIDI {

private File file = null;
private Sequencer sequencer = null;

public MIDI (String midiFile) throws FileNotFoundException {
    this.file = new File(midiFile);
    if (!file.isFile()) {
        throw new FileNotFoundException("File \"" + midiFile + "\" does not exist!");
    }
            try{
        sequencer = MidiSystem.getSequencer();
        if (sequencer == null){
            System.err.println("Error: Sequencer not supported");
            return;
        }
        sequencer.open();
        Sequence sequence = MidiSystem.getSequence(file);
        sequencer.setSequence(sequence);
    }
    catch (MidiUnavailableException | InvalidMidiDataException | IOException ex){
    }
}

public void play(){
        sequencer.start();
}

public void stop() {
    sequencer.stop();
}

public void waitAndStop(int millis) {
    Runnable song = () -> {
        try {
            Thread.sleep(millis);
        }
        catch (InterruptedException e) {
            System.err.println("MIDI playback interrupted");
        }
        stop();
    };
    Thread t = new Thread(song);
    t.start();
}

public long songLengthMicroseconds() {
    return sequencer.getMicrosecondLength();
}
public Sequence getSequence(String resource) {
    try {
        return MidiSystem.getSequence(new File(resource));
    }
    catch (InvalidMidiDataException | IOException ex) {
        return null;
    }
}

}

以下是初始化它并调用歌曲播放的行:

    MIDI midiTest;
    midiTest = new MIDI("src\\Operator\\files\\Opening.mid");
    midiTest.play();

1 个答案:

答案 0 :(得分:1)

我不确定API的“ MIDI”是什么,但是除非您想通过编写安装程序的繁琐工作,否则无法对图标,图片,音乐和数据文件等资源使用直接文件访问。 / p>

请使用getResource / getResourceAsStream机制,该机制返回URL / InputStreams。编写良好的库会像处理文件一样处理这些问题。

基本格式:

try (InputStream resource = MyClassName.class.getResourceAsStream("Opening.mid")) {
    // do something with resource here.
}

其中Opening.mid与MyClassName.class的位置完全相同(因此,如果您以jar形式运输,则它位于jar中,与myClassName.class处于相同的文件夹结构中。如果您希望使用罐子中的根目录“ music”,例如,您可以传递:/music/Opening.mid,并带有反斜杠,以表示您要退出罐子根目录。

第二观察,如果您不知道如何处理异常,最好的解决方案是将无法处理的异常添加到方法的“ throws”行中。如果某种不可能,那么挡块的合适主体是:

throw new RuntimeException("unhandled checked exception", e);

因为现在如果发生错误,您的代码将默默地继续前进。如果这是您的意图(因为,嘿,我猜音乐是可选的),我仍然将其记录为 SOMEWHERE ,现在如果发生错误,您将一无所知。