2013-10-03 5 views
4

Я вообще не владею Java, поэтому я действительно могу воспользоваться вашей помощью. Я пытаюсь прочитать продолжительность и скорость передачи битов из mp3-файла. Я использую java-библиотеку под названием «mp3spi» от http://www.javazoom.net/mp3spi/documents.html.Преобразование кода Java в ColdFusion

Так вар я был в состоянии определить, что эти объекты существуют:

<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:

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] советы по написанию хороших вопросов.В общем, вы должны провести некоторое исследование, попытаться решить проблему самостоятельно, а затем показать, что вы пробовали, что не сработало и с чем конкретно вы столкнулись. Просто сказал: «Пожалуйста, помогите мне перенести этот код» без указания того, что вы действительно что-то сделали, не считается подходящим. –

+0

* getAudioFileFormat не существует * Фактически ошибка говорит немного больше, чем это: «« Либо нет методов с указанным именем метода и типами аргументов, либо метод xxxx перегружен с помощью типов аргументов, которые ColdFusion не может дешифровать достоверно ». ». Поэтому часто это означает, что метод, который вы вызываете, существует, вы просто передаете неправильный тип аргумента. Приведенный выше код передает двоичный код 'getAudioFileFormat()', если вместо него требуется объект 'java.io.File'. Отсюда и ошибка. См. Пример @ Адама о том, как создать объект File (но используйте абсолютный путь, а не только имя файла) – Leigh

ответ

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, так как это также имя области aka' CFFILE'. – Leigh

+0

О да, хорошо! Будет корректировать код. –

5

Ответ Адама твердый. Поскольку вам нужно вызвать конструктор класса 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, настроенной для этого, но в прошлом мы использовали подходы, подобные описанным выше, для расширения интеграции Hibernate ColdFusion путем создания экземпляров классов Java и вызова их методов. До тех пор, пока внешние libs, на которых вы зависимы, находятся в классе классов ColdFusion, вам не должно быть никаких проблем с этим.

+0

FYI, [Метод 'init' - это не метод объекта, а идентификатор ColdFusion, который вызывает функцию' new' в конструкторе класса. "] (Http://help.adobe.com/en_US/ColdFusion/ 10.0/Разработка/WSc3ff6d0ea77859461172e0811cbec14231-7fdd.html) Итак, 'createObject (« java »,« path.to.SomeClass »). Init (...)' эквивалентен java-коду 'new SomeClass (..)'. – Leigh

+0

Правильно, что имеет решающее значение в случае Симоне, поскольку ему нужно вызвать конструктор как в классах File, так и в MpegAudioFileReader. – mchandler

Смежные вопросы