English 中文(简体)
当文件存在时,抛出FileNotFoundException。
原标题:
  • 时间:2009-01-28 04:37:15
  •  标签:

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

我正在尝试读取位于另一台机器中作为共享资源的文件。

\remote-machinedirMyFileHere.txt

当我运行一个独立的应用程序(一个16行的Java文件)时,一切都很好。但是,当我尝试从服务器“引擎”中使用相同的类和方法读取相同的文件(这是一个应用引擎,非常类似于Java EE应用服务器,您可以在其中运行Java程序),就会抛出“FileNotFoundException”。

我以为我需要某种权限,因此把资源映射成驱动器:K:。

重新运行我的Java文件,读取正常。

重新在“引擎”中运行我的Java文件 -> 文件未找到异常。

当我将文件复制到本地计算机上(C:MyFileHere.txt),不会引发异常。

问题

这可能是什么导致了FileNotFoundExcecption?

我正在使用Java 1.5。

据我所知,引擎基本上是透明地使用Java的。

有人面临过类似的情况吗?

额外问题?有什么好的解决方法吗?我正在考虑安装tomcat来通过http读取这些文件,但我认为这太多了,这就是SMB协议首先存在的原因吧?而且我可能无法打开套接字。

安全管理员可能是原因(我以前从未使用过,但我知道它的存在)

如果出现这种情况,会抛出SecurityException异常吗?

非常感谢。

编辑

已解决。谢谢Steve W。

事实证明,这个引擎是由ZeroG的“LaunchAnywhere”启动的。因此,将创建一个.exe,然后使用指定的应用程序运行JVM。

这个应用程序本身是启动器。当它启动引擎时,不知道为什么或怎么样(我无法理解),JVM进程的所有者是SYSTEM用户。正如Steve指出的那样,这个用户没有网络访问权限,因此无法从共享资源或映射驱动器中读取。

解决方法(在我向制造商报告之前)是创建一个 .cmd 文件手动启动引擎。由于它将手动启动,用户可以访问网络。

我使用了SysInternals的“Process Explorer”来确切地知道运行引擎应用程序所使用的命令行。

真糟糕!

感谢那些发布答案的人。

最佳回答

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

问题回答

Double check that the file is REALLY Called "MyFileHere.txt" and not "MyFileHere.txt.txt" If you are hiding the extention of the file this is an easy mistake to miss

Have you checked the event logs on the server to see if it is being rejected? it could be that the program is running under a different user account than you think.

我不熟悉Java,但是我知道我写过的一些程序需要允许网络服务访问资源。

Actually i see that you have now ticked an answer as the correct one. oh and it was the same as my answer :) Cool!

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

文件:////远程机器/目录/我的文件.txt

我使用了以下示例来验证我的共享文件夹中是否存在文件,并成功运行:

public static void main(String[] args) throws URISyntaxException{
    URI uri = new URI(args[0]); //args[0] = 文件:////远程机器/目录/我的文件.txt
    File f = new File(uri);
    System.out.print(String.format("File %1$s Exists? %2$s", args[0],f.exists()));
}




相关问题
热门标签