如何使用getCodeBase()在Java Applet中查找和加载文件?

时间:2012-02-04 15:00:14

标签: java file applet

第一次在这里张贴,将尝试简洁。这是一个经典的“无法访问Applet中的文件”问题,但我遇到了特别的困难。

我正在尝试重写此文件:

A JavaSound test for libpd

进入模板applet以加载在pureData(puredata.info)中创建的libpd(https://github.com/libpd/libpd)补丁...这已经在非applet Java程序中的普通Main函数中工作(参见上文),其中main函数使用以下命令查找补丁:

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'句柄'来识别每个补丁(由于遗留原因,因为$ zero),以便传递int句柄来打开和关闭补丁文件。

所以现在。我正在尝试在Applet中加载相同的文件,因此我认为它在“客户端”中运行并且不知道我在说什么路径,所以我读了java.net.URL并尝试构建变种:

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

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

受applet的init()和start()函数的previous questions启发,将原始main转换为本地静态方法sound()。

我得到的只是空指针。我会认为我需要的只是一个简单的getDocumentBase(),但似乎无法使它工作。任何人吗?

1 个答案:

答案 0 :(得分:1)

libpd只是Pure Data上的一个瘦包装器,Pure Data不知道Java中的URL或输入流。 openPatch方法只是将补丁名称和目录发送给Pd,然后Pd将尝试打开相应的文件。因此,除非您愿意修改安全策略,否则applet已经完成。

关于查找文件,简单示例程序是libpd Eclipse项目的一部分。它意味着在Eclipse中运行,而补丁的硬编码路径与Eclipse中的项目根相关。如果您希望代码在不同的设置中运行,则必须相应地调整路径。