2013-05-08 53 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

相關問題