【问题标题】:Java Applet on OS X - FileNotFoundException (Permission denied)OS X 上的 Java Applet - FileNotFoundException(权限被拒绝)
【发布时间】:2016-02-07 20:28:15
【问题描述】:

我的小程序在 Windows 7 上运行良好(在 IDE 和 Firefox 中部署到网页后作为签名的jar)但在 OS X 上运行时抛出FileNotFoundException (Permission denied)(在 IDE 和 Firefox 中)。

当它尝试使用新的File keyCopy 创建新的FileOutputStream fos 时发生异常:

InputStream is = this.getClass().getClassLoader().getResourceAsStream(sslKeyRingClass[0]);
if (is != null) {
    keyCopy = new File("/" + sslKeyRingClass[0]);
    FileOutputStream fos = new FileOutputStream(keyCopy);
    byte[] buf = new byte[256];
    int read = 0;
    while ((read = is.read(buf)) > 0) {
        fos.write(buf, 0, read);
    }
    fos.close();
    is.close();
}

在删除显式文件分隔符/ 后,它确实可以在 Windows 和 OS X 上的 IDE (Eclipse) 中工作:

keyCopy = new File(sslKeyRingClass[0]);

但在部署为 jar 时在 Windows 和 OS X 上抛出相同的 FileNotFoundException

使用系统相关的分隔符 keyCopy = new File(File.separator + sslKeyRingClass[0]); 给出与显式 '/' 相同的结果;

我在 Eclipse 中使用带有 AllPermission 的策略文件,jar 使用有效的代码签名证书进行签名,并且清单具有 Permissions: all-permissions 属性。

谁能解释为什么会抛出 FileNotFoundException (Permission Denied) 并可能提出一个可以跨平台工作的解决方案?

【问题讨论】:

  • keyCopy = new File("/" + sslKeyRingClass[0]); FileOutputStream fos = new FileOutputStream(keyCopy);在 OS X 上可以通过命令行应用程序运行吗?
  • "sslKeyRingClass[0] 是在小程序代码中定义的,所以在命令行中不可用.." 好的,试试keyCopy = new File("/SomeTypicalStringFromsslKeyRingClassArray" ); FileOutputStream fos = new FileOutputStream(keyCopy);
  • 感谢 Andrew,我应该想到这一点 ;) 我在 emacs 中编写了一个 v 基本 java 程序并从终端运行它。当我使用 new File("/SomeTypicalStringFromsslKeyRingClassArray" ) 时,它会抛出相同的 FileNotFoundException(权限被拒绝),但当我使用 new File("SomeTypicalStringFromsslKeyRingClassArray" ) 时它可以工作,即没有'/'
  • 必应! ...我以为我在某处听说过 OS X 对“根驱动器”有不同的想法,但不确定细节(或者它是否与此处相关)。作为“解决方法”(或者确实是更好的整体策略),我建议将文件放在user.home 中,这是任何受信任的 Java 应用程序的路径。应该能够进行读写访问。
  • 再次感谢安德鲁,这是一个很棒的电话,非常感谢。我现在添加了private static String OS = System.getProperty("os.name").toLowerCase(); private static String homeDir = System.getProperty("user.home"); 并使用这些属性来设置keyCopy 的路径。在 IDE 和浏览器中的 windows 和 mac 上都可以使用。

标签: java macos file applet filenotfoundexception


【解决方案1】:

按照 Andrew 的建议,使用 user.home 而不是“/”作为文件路径。最终解决方案是使用“os.name”来确定用户操作系统,然后使用“user.home”作为路径。这适用于 windows 和 mac。

【讨论】:

  • 很高兴你把它整理好了。 :)
猜你喜欢
  • 1970-01-01
  • 2012-06-03
  • 1970-01-01
  • 2015-06-29
  • 2012-10-24
  • 2011-03-24
  • 1970-01-01
  • 2020-02-14
  • 2015-01-11
相关资源
最近更新 更多