2011-12-19 17 views
8

Estoy trabajando en una aplicación llamada LMCT (Let Me Copy That) y está programada en Java, solo necesito saber cómo grabar en un DVD/CD de Java .Lectura y escritura en un DVD/CD - Java

cualquier ejemplo, API o enlace es bienvenido.

+3

Offhand, esto realmente no parece ser un problema de Java. Quiero decir, cada pieza de hardware tiene que interactuar con el sistema operativo para esto, que en el lado de Java conducirá a código nativo. Entonces no es que no se pueda hacer con Java, pero probablemente tenga que interactuar con el código de otro idioma para hacer el trabajo. – corsiKa

+0

Creo que la mejor manera de hacerlo es usar el IMAPI (C++) y vincularlo con mi código Java –

+0

. Por favor, vuelva a marcar su pregunta, elija "no pertenece aquí" y elija una razón por la cual. Entonces lo cerraré en consecuencia. – BoltClock

Respuesta

7

He hecho esto usando COM4J y IMAPI (solo funciona en Windows).

Este código de ejemplo se quema un archivo ISO usando el primer dispositivo de grabación de CD en el 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"); 

que tenía como complemento a la COM4J genera las clases un poco porque el generador no hizo un trabajo perfecto:

/** 
* 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

Gracias por tu respuesta. ¿Cómo puedo encontrar * IMAIP.jar * y * COM4J.jar *? ¿Hay sus archivos jar para Java? –

+1

@omidnazifi COM4J se puede descargar [aquí] (http://com4j.kohsuke.org/). Las clases IMAPI fueron generadas por COM4J usando una libId de '{2C941FD0-975B-59BE-A960-9A2A262853A5}'. La [tarea Ant tlbimp] (http://com4j.kohsuke.org/ant.html) o el complemento [com4j Maven] (http://com4j.java.net/maven-com4j-plugin/) pueden realizar la generación de código . – prunge

+0

¿Es COM4J una plataforma cruzada? o solo se usa en ** Windows **? –

Cuestiones relacionadas