读写光盘 - Java

12

我正在开发一款名为LMCT(让我复制这个)的应用程序,它是用Java编程的,我只需要知道如何从Java中将内容刻录到DVD/CD。

欢迎任何示例、API或链接。


3
乍一看,这似乎并不像是Java的问题。我的意思是,每个硬件都需要与操作系统进行接口交互,而在Java方面这将导致本地代码。因此,这并不是说不能使用Java来完成,但可能需要与其他语言的代码进行接口交互才能完成任务。 - corsiKa
我认为最好的方法是使用IMAPI(c++)并将其链接到我的Java代码中。 - Liam Haworth
请再次标记您的问题,选择“不适合此处”,并选择一个原因。然后我会相应地关闭它。 - BoltClock
1个回答

9

我使用 COM4JIMAPI(仅适用于Windows)实现了此功能。

以下示例代码将使用系统中的第一个CD记录设备来烧录ISO文件:

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

我需要对COM4J生成的类进行一些补充,因为生成器的工作不是完美的:

/**
 * 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}" );
    }
}

谢谢您的回答。我该如何找到IMAIP.jarCOM4J.jar?它们有Java的jar文件吗? - Omid Nazifi
1
@omidnazifi 可以在此处下载COM4J(http://com4j.kohsuke.org/)。IMAPI类是使用libId“{2C941FD0-975B-59BE-A960-9A2A262853A5}”由COM4J生成的。[tlbimp Ant任务](http://com4j.kohsuke.org/ant.html)或[com4j Maven插件](http://com4j.java.net/maven-com4j-plugin/)可以执行代码生成。 - prunge
COM4J是跨平台的吗?还是只能在Windows上使用? - Omid Nazifi
@omidnazifi 仅限Windows操作系统 - prunge
@prunge,你能详细解释一下如何生成IMAPI类吗? - Pankaj Jawale
@prunge,你知道如何使用IMAPI2和磁盘标题刻录光盘吗?通常在Windows 10中选择记录器时会创建CD / DVD标题,但我无法在IDiscRecorder2或IDiscFormat2Data中找到适当的方法。我是不是漏掉了什么? - vzateychuk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接