2011-12-19 47 views
8

Tôi đang làm việc trên một ứng dụng gọi là LMCT (Let Me Copy That) và được lập trình bằng Java, tôi chỉ cần biết cách ghi ra đĩa DVD/CD từ java .Đọc và ghi vào đĩa DVD/CD - Java

mọi ví dụ, API hoặc liên kết đều được chào đón.

+3

Ngoại lệ, điều này dường như không thực sự là vấn đề Java. Ý tôi là, mỗi phần cứng phải giao tiếp với hệ điều hành này, mà ở phía Java sẽ dẫn đến mã nguồn gốc. Vì vậy, nó không phải là nó không thể được thực hiện với Java, nhưng nó có khả năng sẽ phải giao tiếp với mã ngôn ngữ khác để hoàn thành công việc. – corsiKa

+0

Tôi nghĩ cách tốt nhất để làm điều này là sử dụng IMAPI (C++) và liên kết mã Java của tôi –

+0

Vui lòng gắn cờ lại câu hỏi của bạn, chọn "nó không thuộc về đây" và chọn lý do. Sau đó tôi sẽ đóng nó cho phù hợp. – BoltClock

Trả lời

7

Tôi đã thực hiện việc này bằng cách sử dụng COM4JIMAPI (chỉ hoạt động trên Windows).

mẫu mã này đốt cháy một file ISO bằng cách sử dụng thiết bị ghi âm đĩa CD đầu tiên trong hệ thống:

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"); 

tôi phải bổ sung COM4J tạo lớp một chút vì các máy phát điện đã không làm một công việc hoàn hảo:

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

Cảm ơn câu trả lời của bạn. Làm thế nào tôi có thể tìm thấy * IMAIP.jar * và * COM4J.jar *? Có tệp jar của họ cho java? –

+1

@omidnazifi COM4J có thể được tải xuống tại đây (http://com4j.kohsuke.org/). Các lớp IMAPI được tạo bởi COM4J bằng cách sử dụng một libId của '{2C941FD0-975B-59BE-A960-9A2A262853A5}'. Tác vụ [tlbimp Ant] (http://com4j.kohsuke.org/ant.html) hoặc [com4j Maven plugin] (http://com4j.java.net/maven-com4j-plugin/) có thể thực hiện tạo mã . – prunge

+0

COM4J là nền tảng chéo? hoặc nó chỉ sử dụng trong ** Windows **? –

Các vấn đề liên quan