无法在Java Applet中将文件设置为可写

时间:2013-10-22 11:53:33

标签: java file dll applet

我正在尝试从jar中加载一个dll文件,以便使用此修补程序处理applet:

Extract and load DLL from JAR

我创建文件,将其设置为可写和可执行文件,但是当我用canWrite()/ canExecute()检查它时 它返回false。小程序已签名。

代码:

private static void loadLib() {
URL res = SystemActivityNotifications.class.getResource("/sys-native
    /sysactivitynotifications.dll");
InputStream in = res.openStream();
File dll = new File(path + "sysactivitynotifications.dll");
dll.setExecutable(true);
dll.setWritable(true);
logger.info(dll.canWrite() + " " + dll.canExecute());
FileOutputStream fos = new FileOutputStream(dll);
byte[] array = new byte[1024];
try {
    for(int i = in.read(array); i != 1; i=in.read(array)) {
        fos.write(array, 0, i);
    }
} catch (IOException e) { logger.info("Cannot write to file: " + e.getMessage()); }
fos.close();
in.close();
System.load(dll.getAbsolutePath());
}

文件已正确创建,但在尝试写入时会抛出异常。

编辑:它第二次运行applet时写入文件,但如果我删除文件并再次运行,则第一次迭代不起作用。

忘记提及:上面的所有代码都来自System.load.library(dll)之后的一个catch块;抛出异常。

try
    {
        System.loadLibrary("sysactivitynotifications");

        ptr = allocAndInit();
        if (ptr == -1)
            ptr = 0;
    }
    catch (Throwable t)
    {
        if (t instanceof ThreadDeath)
            throw (ThreadDeath) t;
        else {
           loadLib();
        }
    }

编辑:它抛出了这个错误:

java.lang.UnsatisfiedLinkError: C:\: The process cannot access the file because it is being used by another process

1 个答案:

答案 0 :(得分:1)

  

..尝试从jar加载一个dll文件以使用applet ..

对于部署Java applet,最好的选择通常是使用Java Web Start启动applet。 JWS适用于Windows,OS X& * nix中。

  

Java Web Start(JWS)是Oracle Corporation用于直接从网络或Internet链接启动富客户端(Swing,Java-FX,AWT,SWT ..)桌面应用程序的技术。它为支持Java的平台提供“一键式”安装。

     

JWS提供了许多吸引人的功能,包括但不限于启动屏幕,桌面集成,文件关联,自动更新(包括延迟下载和程序控制更新),原生的分区&按平台,体系结构或语言环境下载的其他资源,运行时环境的配置(最低J2SE版本,运行时选项,RAM等),使用扩展轻松管理公共资源..

将原生代码放在(已签名)Jar的根目录中,并在启动文件中添加对该Jar的引用,它们将被放置在应用程序的类路径中。