【发布时间】: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