文件存在时抛出FileNotFoundException异常

3

我遇到了一个奇怪的问题。

我正在尝试读取位于另一台计算机上作为共享资源的文件:

\\remote-machine\dir\MyFileHere.txt

当我运行一个独立的应用程序(一个16行的Java文件)时,一切都很好。但是当我尝试从服务器“引擎”(这是一个应用程序引擎,非常像Java EE应用程序服务器,您可以在其中运行Java程序)使用相同的类和相同的方法读取相同的文件时,“FileNotFoundException”被抛出。
我认为这可能是某种权限问题,所以我将资源映射为驱动器:K:\
重新运行我的Java文件,可以读取,没问题。
在“引擎”内部重新运行我的Java文件-> FileNotFoundException。
当我将文件复制到本地机器(C:\MyFileHere.txt)时,不会抛出异常。
问题:
是什么原因导致了这个FileNotFoundException?
我正在使用Java 1.5
据我所知,引擎几乎透明地使用Java。
有人遇到过类似的问题吗?
另一个问题?解决此问题的一个好方法是什么?我开始考虑通过tomcat安装来提供这些文件并通过http读取它们,但我认为那太麻烦了,首先SMB协议就是为此而存在的,不是吗?而且可能我无法打开套接字。
安全管理器可能是原因吗(我以前从未使用过,但我知道它存在)?
如果是这样,难道不会抛出SecurityException吗?
非常感谢。
编辑:
问题已解决。谢谢Steve W。
事实证明,这个引擎是使用ZeroG的“LaunchAnywhere”启动的。因此,创建了一个.exe,它将运行带有指定应用程序的JVM。
这个应用程序本身就是启动器。当它启动引擎时,某种方式(我无法弄清楚为什么或如何)拥有JVM进程的用户是SYSTEM。正如Steve所指出的那样,该用户没有网络访问权限,因此无法从共享资源或映射的驱动器中读取。
解决方法(在我向制造商报告之前)是创建一个.cmd文件手动启动引擎。由于它将被手动启动,因此用户可以访问网络。
我使用SysInternals的“Process Explorer”精确知道了用于运行引擎应用程序的命令行。
真是一团糟!
感谢那些发布答案的人。
4个回答

6

共享资源是否受到用户名和密码的保护?如果是,您的应用引擎是否以该用户身份运行?如果您的应用引擎正在作为Windows服务运行,则Windows服务不能作为“本地系统账户”运行。因为该账户无法访问网络。您必须将服务配置为以具有访问共享驱动器权限的用户身份运行。


1stq: 是的。 2ndq: 不是。 第三个问题不涉及服务,但是仔细看,启动器正在作为本地用户运行,但这个启动器再启动引擎应用程序时,其用户是SYSTEM(因此不允许使用网络):-/ 我该如何看待这个启动器可以如何以非SYSTEM用户身份启动应用程序? - OscarRyz
我正在查看“引擎”,它是使用LaunchAnywhere(来自zerog)启动的。我不知道它如何使用SYSTEM启动新的VM :-/ - OscarRyz
这个答案给了我解决问题的提示。非常感谢。 - OscarRyz

0

请仔细检查文件名是否真的是"MyFileHere.txt"而不是"MyFileHere.txt.txt"。如果您隐藏了文件扩展名,这是一个容易忽略的错误。


但是话说回来,我并没有完全阅读你的问题。我只记得上述问题发生了,我为某人调试这个问题而苦恼了一番。 - Andrew Harry
双重和超级三重检查。还有空格等。我甚至在Java文件中硬编码了路径,使用java TestRead可以正常运行。但是当TestRead类加载到引擎中时,它会抛出FNFE异常。 - OscarRyz

0

你有检查服务器上的事件日志,看看它是否被拒绝了吗? 可能是程序正在以不同于你想象的用户帐户下运行。

我不熟悉Java,但我知道对于一些我编写的程序,我必须允许网络服务访问资源。

实际上,我看到你现在已经选中一个答案作为正确答案。 哦,它和我的答案一样 :) 很酷!


jejej 是的.. 非常感谢。实际上你的推断相当接近。我自己对Windows服务不是很了解,这让我感到惊讶。但是,我最终在Steve的建议中得到了一个好的提示。ufff。无论如何还是谢谢。 - OscarRyz

0

我曾经遇到过类似的问题。我认为这与Java解析远程文件URI的方式有关。尝试以下方法,看看是否有效:

File:////remote-machine/dir/MyFileHere.txt

我使用了以下示例来验证我的计算机中共享文件夹中文件的存在,并且它有效:

public static void main(String[] args) throws URISyntaxException{
    URI uri = new URI(args[0]); //args[0] = File:////remote-machine/dir/MyFileHere.txt
    File f = new File(uri);
    System.out.print(String.format("File %1$s Exists? %2$s", args[0],f.exists()));
}

谢谢你Igor。这不是问题所在,因为在引擎内部和外部都使用了相同的“路径”。问题在于使用了SYSTEM用户创建了VM,该用户没有网络资源访问权限。尽管如此感谢你的回复。 - OscarRyz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接