从java小程序中写入文件时出现问题

从java小程序中写入文件时出现问题,java,jar,applet,Java,Jar,Applet,我创建了一个简单的Java类来测试小程序中的文件写入: 出现更新 public class localfile extends Applet{ public localfile(){ try { File f = new File("testfile.txt"); BufferedWriter out = new BufferedWriter(new FileWriter(f,true)); out.write("test");

我创建了一个简单的Java类来测试小程序中的文件写入:
出现更新

public class localfile extends Applet{
public localfile(){
    try {
        File f = new File("testfile.txt");
        BufferedWriter out = new BufferedWriter(new FileWriter(f,true));
        out.write("test");
        out.close();
    }
    catch(Exception x)
       System.err.println(x.toString());
   }
}
我已经创建并签署了jar:

jar cvf localfile.jar localfile.java
jarsigner localfile.jar yourkey
html看起来像:

每次运行此小程序时都会出现以下错误:

java.lang.SecurityException: trusted loader attempted to load sandboxed resource from file:/home/w/test/
at com.sun.deploy.security.CPCallbackHandler$ParentCallback.check(CPCallbackHandler.java:308)
at com.sun.deploy.security.CPCallbackHandler$ParentCallback.access$1400(CPCallbackHandler.java:121)
at com.sun.deploy.security.CPCallbackHandler$ChildElement.checkResource(CPCallbackHandler.java:473)
at sun.plugin2.applet.Plugin2ClassLoader.checkResource(Plugin2ClassLoader.java:701)
at sun.plugin2.applet.Applet2ClassLoader.findClass(Applet2ClassLoader.java:206)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at sun.plugin2.applet.Plugin2ClassLoader.loadCode(Plugin2ClassLoader.java:520)
at sun.plugin2.applet.Plugin2Manager.createApplet(Plugin2Manager.java:2940)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Plugin2Manager.java:1444)
at java.lang.Thread.run(Thread.java:619)
Exception: java.lang.SecurityException: trusted loader attempted to load sandboxed resource from file:/home/w/test/
奇怪的是:我已经创建了类似的applet来读取文件,它工作正常

有什么想法吗


我在浏览器和小程序查看器上运行这个小程序。奇怪的是,给定的applet在appletviewer上不工作,并抛出异常,但在浏览器上就可以了

java.security.AccessControlException: access denied (java.util.PropertyPermission java.security.policy write)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.System.setProperty(System.java:725)
at localfile.<init>(localfile.java:15)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at java.lang.Class.newInstance0(Class.java:355)
at java.lang.Class.newInstance(Class.java:308)
at sun.applet.AppletPanel.createApplet(AppletPanel.java:785)
at sun.applet.AppletPanel.runLoader(AppletPanel.java:714)
at sun.applet.AppletPanel.run(AppletPanel.java:368)
at java.lang.Thread.run(Thread.java:619)
java.security.AccessControlException:拒绝访问(java.util.PropertyPermission java.security.policy写入)
位于java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
在java.security.AccessController.checkPermission(AccessController.java:546)
位于java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
位于java.lang.System.setProperty(System.java:725)
在localfile.(localfile.java:15)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:513)
位于java.lang.Class.newInstance0(Class.java:355)
位于java.lang.Class.newInstance(Class.java:308)
在sun.applet.AppletPanel.createApplet(AppletPanel.java:785)中
位于sun.applet.AppletPanel.runLoader(AppletPanel.java:714)
运行(AppletPanel.java:368)
运行(Thread.java:619)

所以,除了这种奇怪的行为,我认为我的问题解决了。谢谢大家:)

您是否提供了允许从文件系统读取文件的策略

似乎您只在jar上签名,但没有使用policytool。


这将有助于您创建策略文件并与代码库相关联

通过一些欺骗,您可以在jar中包含一个策略文件。有关更多信息,请参阅SO问题


另外,考虑制作一个java WebScript应用程序,它可以更容易地读写文件。

< P>我相信你的问题是,包括你试图加载的文件的目录在类文件和应用程序资源被查找的代码库内。因此,您最终混合了受信任和不受信任的资源,这是不安全的。如果小程序托管在http或更好的https服务器上,则文件不会出现问题

注意:您可以使用JNLPAPI用于小程序,通过文件对话框“打开”或写入文件

在发生异常时,您的资源处理会使文件保持打开状态。资源处理应采用以下方式编写:

Resource resource = acquire();
try {
     use(resource);
} finally {
     resource.release();
}
在您的具体情况下:

final FileOutputStream rawOut = new FileOutputStream(file);
try {
    ...
    out.flush();
} finally {
    rawOut.close();
}

我知道这已经很晚了。但为了帮助那些发现这个错误的人-

使用Ant,可以一次性对多个jar进行签名,例如java-comm.jar等

<target name="applet.sign" description="Sign the applet jar">
<signjar jar="${applet.dir}/*.jar"
         storepass="${applet.key.password}"
         keystore="${applet.keystore}"
         alias="${applet.key.alias}"
         keypass="${applet.key.password}" />


这将对目录中的所有jar进行签名。

我创建了文件localfile.policy,其内容为:grant{permission java.io.FilePermission”“,“write”;};但是我如何把它应用到罐子上呢?顺便说一句,我想写本地文件。我已经创建了策略文件,但要应用此策略,我必须编辑系统文件。还有别的办法吗?默认情况下,允许读取本地文件。我不想编辑此小程序用户使用的所有计算机上的系统文件。不幸的是,Java WebStart不是一个选项:/在添加一些已编译的导入小程序后,出现新错误(拒绝访问),我正在调查。我也有同样的问题,但使用JNLP/“WebStart”,因此这可能不是一个好的解决方案。