[英]How to copy a midi sequence in Java?
我使用以下代碼復制javax.sound.midi.Sequence
:
private Object copyObject(Object objSource)
{
Object objDest=null;
try
{
ByteArrayOutputStream bos=new ByteArrayOutputStream();
ObjectOutputStream oos=new ObjectOutputStream(bos);
oos.writeObject(objSource);
oos.flush();
oos.close();
bos.close();
byte[] byteData=bos.toByteArray();
ByteArrayInputStream bais=new ByteArrayInputStream(byteData);
try { objDest=new ObjectInputStream(bais).readObject(); }
catch (ClassNotFoundException e) { e.printStackTrace(); }
}
catch (IOException e) { e.printStackTrace(); }
return objDest;
}
javax.sound.midi.Sequence sequence;
...
javax.sound.midi.Sequence newSequence=(Sequence)copyObject(sequence);
我收到以下錯誤:
java.io.NotSerializableException:javax.sound.midi.Sequence
這樣做的正確方法是什么?
如異常所示,Sequence不是可序列化的類,因此您無法對其進行序列化。
使用MidiSystem.write和MidiSystem.getSequence代替ObjectOutputStream和ObjectInputStream:
if (objSource instanceof Sequence) {
Sequence sequence = (Sequence) objSource;
int[] types = MidiSystem.getMidiFileTypes(sequence);
MidiSystem.write(sequence, types[0], bos);
byte[] byteData = bos.toByteArray();
ByteArrayInputStream bais = new ByteArrayInputStream(byteData);
try {
return MidiSystem.getSequence(bais);
} catch (InvalidMidiDataException e) {
throw new IOException(e);
}
}
另一種方法是創建一個新的Sequence,並復制每個原始Sequence的Track,這意味着使用克隆的MidiMessages復制每個Track的MidiEvent。
如果您希望可以通用復制任何對象的方法,恐怕根本不可能。 不可序列化的對象將始終需要手動復制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.