第一次在这里张贴,将尝试简洁。这是一个经典的“无法访问Applet中的文件”问题,但我遇到了特别的困难。
我正在尝试重写此文件:
进入模板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(),但似乎无法使它工作。任何人吗?
答案 0 :(得分:1)
libpd只是Pure Data上的一个瘦包装器,Pure Data不知道Java中的URL或输入流。 openPatch方法只是将补丁名称和目录发送给Pd,然后Pd将尝试打开相应的文件。因此,除非您愿意修改安全策略,否则applet已经完成。
关于查找文件,简单示例程序是libpd Eclipse项目的一部分。它意味着在Eclipse中运行,而补丁的硬编码路径与Eclipse中的项目根相关。如果您希望代码在不同的设置中运行,则必须相应地调整路径。