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

  • 本文关键字:mid 文件 jar java
  • 更新时间 :
  • 英文 :


我正在和一些朋友一起使用Netbeans开发一个基于文本的RPG。它在Netbeans中运行得很好,但当我将它导出到.jar文件时,我会收到这个错误。

2019年1月28日下午2:27:15操作员.DragonsHead启动执行的操作严重:无效java.io.FileNotFoundException:文件"src\Operator\files\Opening.mid"不存在!

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

我对Java编程还比较陌生,去年我上了一门课程。

我试着在网上寻找有同样问题的人,但我的代码无法完全复制。

这是midi类:

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();

我不确定API是什么"MIDI",但除非你想完成编写安装程序的繁琐过程,否则你不能使用直接文件访问图标、图片、音乐和数据文件等资源。

相反,使用getResource/getResourceAsStream机制,该机制返回URL/InputStreams。写得好的库和文件一样接受这些。

基本格式:

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

其中Opening.mid与MyClassName.class位于完全相同的位置(因此,如果您以jar形式发货,则它位于jar中,与MyClassName.cclass位于相同的文件夹结构中。如果您希望在jar中有一个根目录"music",则可以传递例如:/music/Opening.mid,带前导斜杠,表示您要离开jar根目录。

其次,若您不知道如何处理异常,最好的解决方案是将无法处理的异常添加到方法的"throws"行中。如果这在某种程度上是不可能的,那么捕获块的合适主体是:

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

因为现在,如果出现错误,您的代码将默默地继续运行。如果这是你的意图(因为,嘿,我想音乐是可选的),我仍然会把它记录在某个地方,现在如果发生错误,你就不会知道了。

最新更新