2013-05-08 62 views
0

何时应关闭作为参数传递给MIDI定序器的InputStream? 当调用Sequencer.close()时它会自动关闭吗,还是应该在输入流被读入音序器后关闭输入流?关闭MIDI的InputStream

public MidiSound(InputStream in) throws MidiUnavailableException, 
     IOException, InvalidMidiDataException { 
    sequencer = MidiSystem.getSequencer(); 
    synth = MidiSystem.getSynthesizer(); 
    receiver = MidiSystem.getReceiver(); 

    sequencer.open(); 
    synth.open(); 
    sequencer.getTransmitter().setReceiver(receiver); 
    sequencer.setSequence(in); 
    //in.close()? 
} 

回答

0

InputStream(所有的I/O,差不多)需要关闭。

如果使用Java 7,则可以使用新的“try-with-resources”语法。

例如,

try (AudioInputStream ais = AudioSystem.getAudioInputStream(url)) 
{ 
    //audio handling here 
} 

有了这个语法,没有必要明确地关闭新定义AudioInputStreamfinally块。 Java运行时会自动执行。该语法可以用于实现AutoCloseable接口的任何I/O类型。

我刚刚在两周前了解到这一点。我正在阅读Poornachandra Sarang,Oracle Press 2012上的“Java编程 - 学习Java专家的高级技能”。我对这本书印象深刻!

+0

这是否也适用于MIDI? Java似乎有不同的MIDI文件库 – jedyobidan 2013-05-09 22:33:43

+0

好的,我只是在API规范中查找了MidiDeviceReceiver。它扩展了Receiver,继而扩展了AutoCloseable。我的猜测是AutoCloseable的存在表明有资源可以并且应该关闭。否则,它为什么会在那里? MidiDevice API中还有一些关于关闭的文本; http://docs.oracle.com/javase/7/docs/api/javax/sound/midi/MidiDevice.html希望有所帮助。 – 2013-05-10 03:05:25

+0

事实上,AutoCloseable的api指出:“不再需要时必须关闭的资源。” http://docs.oracle.com/javase/7/docs/api/java/lang/Au​​toCloseable.html – 2013-05-10 03:09:08

相关问题