2011-12-19 25 views
8

Sto lavorando a un'applicazione chiamata LMCT (Let Me Copy That) ed è programmata in Java, ho solo bisogno di sapere come masterizzare su un DVD/CD da java .Lettura e scrittura su DVD/CD - Java

qualsiasi esempio, API o collegamento è il benvenuto.

+3

A mano libera, questo non sembra un problema Java. Voglio dire, ogni componente hardware deve interfacciarsi con il sistema operativo per questo, che dal lato Java porterà al codice nativo. Quindi non è che non potrebbe essere fatto con Java, ma probabilmente dovrebbe interfacciarsi con il codice di un'altra lingua per portare a termine il lavoro. – corsiKa

+0

Penso che il mio modo migliore per farlo sia usare l'IMAPI (C++) e collegarlo al mio codice Java –

+0

Contrassegna nuovamente la domanda, scegli "non appartiene a questo" e scegli un motivo per cui. Lo chiuderò di conseguenza. – BoltClock

risposta

7

Ho fatto questo utilizzando COM4J e IMAPI (funziona solo su Windows).

Questo codice di esempio brucia un file ISO utilizzando il primo dispositivo di registrazione di CD nel sistema:

File isoFile = new File("myimage.iso"); 

IDiscMaster2 dm = ClassFactory.createMsftDiscMaster2(); 
int count = dm.count(); 

//Pick the first recorder on the system 
String recorderUniqueId = null; 
for (int i = 0; i < count; i++) 
{ 
    String cur = dm.item(i); 
    recorderUniqueId = cur; 
} 

IDiscRecorder2 recorder = ClassFactory.createMsftDiscRecorder2(); 
recorder.initializeDiscRecorder(recorderUniqueId); 
System.out.println("Using recorder: " + recorder.vendorId() + " " + recorder.productId()); 

IIsoImageManager imageManager = StreamClassFactory.createMsftIsoImageManager(); 
imageManager.setPath(isoFile.getAbsolutePath()); 
imageManager.validate(); 
System.out.println("ISO Validation successful: " + isoFile.getAbsolutePath()); 

IDiscFormat2DataExt discData = ClassFactoryExt.createMsftDiscFormat2Data(); 
discData.recorder(recorder); 
discData.clientName(IsoMan.class.getSimpleName()); 
int mediaStatus = discData.currentMediaStatusExt(); 
System.out.println("Media status: " + mediaStatus); 
if ((mediaStatus & IMAPI_FORMAT2_DATA_MEDIA_STATE.IMAPI_FORMAT2_DATA_MEDIA_STATE_WRITE_PROTECTED.comEnumValue()) != 0) 
    throw new RuntimeException("Media is write protected/not empty."); 

//Check if disc is empty 
int addr = discData.nextWritableAddress(); 
if (addr != 0) 
    throw new RuntimeException("Disc is not empty, not writing."); 

IStream isoStream = imageManager.stream(); 

System.out.println("Writing CD"); 
discData.write(isoStream); 
System.out.println("Finished writing"); 

ho dovuto integrare il COM4J generato classi un po 'perché il generatore non ha fatto un lavoro perfetto:

/** 
* Defines methods to create COM objects 
*/ 
public abstract class ClassFactoryExt { 
    private ClassFactoryExt() {} // instanciation is not allowed 

    /** 
    * Microsoft IMAPIv2 Data Writer 
    */ 
    public static com.ms.imapi2.IDiscFormat2DataExt createMsftDiscFormat2Data() { 
     return COM4J.createInstance(com.ms.imapi2.IDiscFormat2DataExt.class, "{2735412A-7F64-5B0F-8F00-5D77AFBE261E}"); 
    } 
} 

/** 
* Data Writer 
*/ 
@IID("{27354153-9F64-5B0F-8F00-5D77AFBE261E}") 
public interface IDiscFormat2DataExt extends com.ms.imapi2.IDiscFormat2Data { 
    /** 
    * The state (usability) of the current media 
    */ 
    @VTID(18) 
    //com.ms.imapi2.IMAPI_FORMAT2_DATA_MEDIA_STATE currentMediaStatus(); 
    int currentMediaStatusExt(); 
} 

/** 
* Defines methods to create COM objects 
*/ 
public abstract class StreamClassFactory { 
    private StreamClassFactory() {} // instanciation is not allowed 


    /** 
    * Boot options 
    */ 
    public static com.ms.imapi2.IBootOptions createBootOptions() { 
     return COM4J.createInstance(com.ms.imapi2.IBootOptions.class, "{2C941FCE-975B-59BE-A960-9A2A262853A5}"); 
    } 

    /** 
    * File system image 
    */ 
    public static com.ms.imapi2.IFileSystemImage3 createMsftFileSystemImage() { 
     return COM4J.createInstance(com.ms.imapi2.IFileSystemImage3.class, "{2C941FC5-975B-59BE-A960-9A2A262853A5}"); 
    } 

    /** 
    * Microsoft IMAPIv2 Iso Image Manager 
    */ 
    public static com.ms.imapi2.IIsoImageManager createMsftIsoImageManager() { 
     return COM4J.createInstance(com.ms.imapi2.IIsoImageManager.class, "{CEEE3B62-8F56-4056-869B-EF16917E3EFC}"); 
    } 
} 
+0

Grazie della risposta. Come posso trovare * IMAIP.jar * e * COM4J.jar *? Ci sono i loro file jar per java? –

+1

@omidnazifi COM4J può essere scaricato [qui] (http://com4j.kohsuke.org/). Le classi IMAPI sono state generate da COM4J utilizzando una libId di '{2C941FD0-975B-59BE-A960-9A2A262853A5}'. Il [tlbimp Ant task] (http://com4j.kohsuke.org/ant.html) o il [com4j Maven plugin] (http://com4j.java.net/maven-com4j-plugin/) possono eseguire la generazione del codice . – prunge

+0

COM4J è una piattaforma multipla? o usa solo in ** Windows **? –