我正在尝试使用一种显然适用于非applet Java代码的方法来获取文件列表。
我完全清楚这是凌乱的;我只是想让这个去上学。 (我不是Java的粉丝。)
CodeSource src = MemoryButtonHelper.class.getProtectionDomain().getCodeSource();
if (src == null) {
throw new Exception();
}
URL jar = src.getLocation();
System.out.println("Loading from " + jar);
JarFile zf=new JarFile(jar.toString()); //jar.openStream());
final Enumeration<JarEntry> entries = zf.entries();
while (entries.hasMoreElements()) {
final JarEntry ze = entries.nextElement();
if(ze.getName().endsWith(".jpg") || ze.getName().endsWith(".png"))
{
System.out.println("Adding " + ze.getName());
slikeList.add(ze.getName());
}
}
zf.close();
不幸的是,我遇到了安全例外。
java.security.AccessControlException: access denied (java.lang.RuntimePermission getProtectionDomain)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.Class.getProtectionDomain(Class.java:2106)
at hr.tvz.programiranje.java.deseti.helpers.MemoryButtonHelper.getSlike(MemoryButtonHelper.java:75)
… ad nauseam …
根据Java控制台,异常似乎发生在println("Loading from " + jar)
。
这是一个奖励积分,具体说明我们必须从JAR文件中获取图像列表。由于这是我第一次遇到小程序,我不知道如何才能获取图像列表。
答案 0 :(得分:2)
..我们必须从JAR文件中获取图像列表。
谁把它们放在那里?如果答案是“我们做了”,解决方案很简单。
images/imagelist.txt
)添加图像路径/名称列表。getResource(String)
获取对列表的引用。显然他们希望我按原样列出jar的内容,而不需要额外的元数据。
行。如果您可以在Zip文件中形成一个URL(从而形成InputStream
),则可以从中建立ZipInputStream
。无论URL是否仍在服务器上的本地文件系统或上缓存的Zip / Jar,这都应该有效。
ZipInputStream
getNextEntry()
迭代条目,直到null
ArrayList
。当然,你还需要签名&amp;用于调用保护域的可信代码。
图像肯定在同一个JAR中
要获取Jar的URL,请尝试此操作(未经测试)。我们假设applet是com.our.BookingApplet
。
URL urlToApplet = this.getClass().getResource("/com/our/BookingApplet.class")
String[] parts = urlToApplet.toString().split("!")
将提供两部分,第一部分将是Jar网址的String
表示。String
建立URL
,然后按照上一次更新中的说明使用URL
。答案 1 :(得分:1)
感谢Andrew Thompson的excellent answer!绝对赞成(或另外)对这个问题的答案,因为没有他的帮助,我将无法弄清楚这一点。
以下是我提出的用于获取JAR文件中.jpg
和.png
文件列表的代码部分。请注意,您可能需要更改存储MemoryGame
类的包的名称,以及更改类本身的名称。
List<String> slikeList = new ArrayList<String>();
URL urlToApplet = MemoryGame.class.getResource("/com/whoever/whatever/gui/MemoryGame.class");
String[] parts = urlToApplet.toString().split("!");
String jarURLString = parts[0].replace("jar:", "");
System.out.println("Loading from " + jarURLString);
URL jar = new URL(jarURLString);
URLConnection jarConnection = jar.openConnection();
JarInputStream jis = new JarInputStream(jarConnection.getInputStream());
JarEntry je = jis.getNextJarEntry();
while(je != null)
{
System.out.println("Inspecting " + je);
if(je.getName().endsWith(".jpg") || je.getName().endsWith(".png"))
{
System.out.println("Adding " + je.getName());
slikeList.add(je.getName());
}
je = jis.getNextJarEntry();
}
如果您想知道,slike
在克罗地亚语中的含义为images
,因为练习规范中指定的许多变量都是克罗地亚语。
答案 2 :(得分:0)
只允许“已签名”的小程序访问文件系统。如果您正在读取的jar文件位于本地文件系统上,则需要先对该applet进行签名。
有关如何对小程序进行签名的详细信息,请参阅this链接。