簡體   English   中英

如何在Java中復制Midi序列?

[英]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.writeMidiSystem.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM