Как найти и загрузить файл в Java-апплете, используя getCodeBase ()? - PullRequest
0 голосов
/ 04 февраля 2012

При первом размещении здесь постараюсь быть кратким. Это классическая проблема «не удается получить доступ к файлу в апплете», но у меня возникли особые трудности.

Я пытаюсь переписать этот файл:

Тест JavaSound для libpd

в шаблонный апплет для загрузки libpd (https://github.com/libpd/libpd) патчей, сделанных в PureData (puredata.info) ... это уже работает в обычной функции Main в Java-программе без апплета (см. Выше), где основная функция находит патч используя:

PdBase.openAudio(0, outChans, (int) sampleRate);
    int patch = PdBase.openPatch("samples/com/noisepages/nettoyeur/libpd/sample/test.pd");
    PdBase.computeAudio(true);

Причина, по которой он пытается загрузить путь и файл в переменную int, заключается в том, что сама функция ядра делает это с помощью:

public synchronized static int openPatch(File file) throws IOException {
    if (!file.exists()) {
        throw new FileNotFoundException(file.getPath());
    }
    String name = file.getName();
    File dir = file.getParentFile();
    long ptr = openFile(name, (dir != null) ? dir.getAbsolutePath() : ".");
    if (ptr == 0) {
        throw new IOException("unable to open patch " + file.getPath());
    }
    int handle = getDollarZero(ptr);
    patches.put(handle, ptr);
    return handle;
}
public synchronized static int openPatch(String path) throws IOException {
    return openPatch(new File(path));
}

Это связано с тем, что PD пытается идентифицировать каждый патч, давая дескриптор int (dollarZero, по старым причинам), так что дескриптор int передается для открытия и закрытия файла патча.

Так что теперь. Я пытаюсь загрузить тот же файл в апплет, поэтому, поскольку я считаю, что он запускается «в клиенте» и не знает, по какому пути я говорю, я прочитал на java.net.URL и попытался собрать вариации:

        patchURL = new URL("test.pd");
    PdBase.openPatch(patchURL.getPath().toString());

и

URL url = this.getClass().getResource("test.pd");

вдохновлено предыдущими вопросами в функциях init () и start () апплета, превращая исходную основную часть в звук локального статического метода ().

Все, что я получаю, это нулевые указатели. Я бы подумал, что все, что мне нужно, - это простой метод getDocumentBase (), но, похоже, я не могу заставить его работать. Кто-нибудь?

1 Ответ

1 голос
/ 04 февраля 2012

libpd - просто тонкая оболочка поверх Pure Data, и Pure Data не знает об URL-адресах или входных потоках в Java.Метод openPatch просто отправляет имя и каталог патча в Pd, а затем Pd попытается открыть соответствующий файл.Итак, апплеты отсутствуют, если только вы не готовы возиться с политиками безопасности.

Что касается поиска файлов, простой пример программы является частью проекта libpd Eclipse.Он предназначен для запуска в Eclipse, а жестко заданный путь к патчу относится к корню проекта в Eclipse.Если вы хотите, чтобы ваш код выполнялся в других настройках, вы должны соответствующим образом скорректировать свои пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...