将Java代码转换为ColdFusion

4
我是一个有用的助手,可以为您翻译文本。以下是您需要翻译的内容:

我完全不擅长Java,所以我真的需要您的帮助。我正在尝试从mp3文件中读取持续时间和比特率。我正在使用名为“mp3spi”的Java库,来源于http://www.javazoom.net/mp3spi/documents.html

到目前为止,我已经确定这些对象存在:

<cfset AudioFormat = createObject("java", "org.tritonus.share.sampled.TAudioFormat")>
<cfset AudioFileFormat = createObject("java", "org.tritonus.share.sampled.file.TAudioFileFormat")>
<cfset AudioFileReader = createObject("java", "javax.sound.sampled.spi.AudioFileReader")>

我遇到了以下代码的问题,需要将其转换为ColdFusion代码:

我遇到了以下代码的问题,需要将其转换为ColdFusion代码:

File file = new File("filename.mp3");
AudioFileFormat baseFileFormat = new MpegAudioFileReader().getAudioFileFormat(file);
Map properties = baseFileFormat.properties();
Long duration = (Long) properties.get("duration");

我尝试了几种设置上述变量的方法,但是我一直收到错误消息,提示MpegAudioFileReader或getAudioFileFormat不存在。然而,当我转储用于创建Java对象的变量时,它们确实存在。
以下是我的代码:
<cfscript>
    mp3file = FileOpen(ExpandPath("./") & originalfile, "readBinary");
    baseFileFormat = AudioFileReader.getAudioFileFormat(mp3file);
    properties = baseFileFormat.properties();
    duration = properties.get("duration");
</cfscript>

7
欢迎来到SO,请阅读[FAQ]和[Ask]以获取有关编写好问题的提示。通常情况下,您需要进行一些研究,尝试自己解决问题,然后展示您所尝试过的、未成功的方法以及具体遇到了什么问题。只是说“请帮助我移植这段代码”,没有任何证据表明您已经做了任何事情,这被认为不合适。 - Jim Garrison
“getAudioFileFormat doesn't exist”并不是完整的错误信息。实际上,错误信息还包括:“Either there are no methods with the specified method name and argument types or the xxxx method is overloaded with argument types that ColdFusion cannot decipher reliably.”。这通常意味着你调用的方法确实存在,只是传入了错误的参数类型。以上代码将二进制数据传递给了getAudioFileFormat()方法,而该方法需要一个java.io.File对象作为参数。因此出现了错误。请参考@Adam的示例,了解如何创建一个File对象(但要使用绝对路径,而不仅仅是文件名)。 - Leigh
2个回答

6
我不会为你编写代码,Simone,但是有几个一般性的提示。
File file = new File("filename.mp3");

你可能已经知道,CFML是一种松散类型的语言,因此在LHS上可以省略类型声明。然后,你需要使用createObject()函数创建Java对象,这个函数已经有了一个句柄。CF不能导入Java库,所以你需要提供File类的完整路径。你还需要显式调用构造函数:

mp3File = createObject("java", "java.io.File").init("filename.mp3");

(正如@Leigh在下面指出的那样,file是CFML中一种保留字,因此最好不要将其用作变量名!因此,我在这里使用mp3File)。
从那里开始...你应该能够很容易地完成其他三个语句的工作。基本的方法调用和赋值可以直接从Java源代码转换过来,只需像上面所述般丢弃静态类型位和类型转换(long)等即可。
如果您无法从这里解决所有问题,请在问题中更新您的实验结果,我们可以改进这个答案(或者其他人可以发布一个不同的答案)。但您需要给我们您具体的问题,而不仅仅是一个普遍的“请写我的代码”。人们不会这样做,您也不应该在这里问人们(这违反了规则,在StackOverflow上人们非常重视规则)。

5
尽管可能最好避免使用 file 作为 CF 变量名,因为它也是一个作用域的名称,即 CFFILE - Leigh

5

Adam的答案很好。由于您需要调用Java类的构造函数才能创建实例,而不仅仅是使用静态方法,因此必须调用“init()”方法。具体如下:

mp3file = createObject("java", "java.io.File").init("filename.mp3");
baseFileFormat = createObject("java", "path.to.MpegAudioFileReader").init().getAudioFileFormat(mp3file);
properties = baseFileFormat.properties();
duration = properties.get("duration");

亚当的指导是正确的,即在初始化变量时打类型不可行。我没有设置ColdFusion环境来尝试这个,但过去我们使用了上面的方法来扩展ColdFusion的Hibernate集成,通过创建Java类的实例并调用它们的方法。只要您依赖的外部库位于ColdFusion服务器的类路径中,就不应该遇到任何问题。


请注意,init方法不是对象的方法,而是ColdFusion标识符,用于调用类构造函数上的new函数。 因此,createObject("java", "path.to.SomeClass").init(...) 等同于Java代码 new SomeClass(..) - Leigh
正确性对于Simone来说非常关键,因为他需要在File和MpegAudioFileReader类上都调用构造函数。 - mchandler

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