我正面临这个奇怪的问题。
我正在尝试将位于另一台计算机上的文件作为共享资源读取:
\\remote-machine\dir\MyFileHere.txt
当我运行一个独立的应用程序(16行java文件)时,一切都很好。但是,当我尝试使用相同的类和相同的方法从服务器“引擎”(这是一个应用程序引擎,非常类似于Java EE Application Server,您可以运行Java程序)读取相同的文件时,“FileNotFoundException”扔了。
我虽然会获得某种权限,但我将资源映射为驱动器:K:\
重新运行我的java文件,读取,没问题。
在“引擎”中重新运行我的java文件 - > FileNotFoundException异常。
当我将文件复制到本地计算机(C:\ MyFileHere.txt)时,不会抛出任何异常。
问题
可能导致此FileNotFoundExcecption的原因是什么?
我正在使用Java 1.5
据我所知,引擎几乎透明地使用java。
任何人都遇到过类似的事情吗?
其他问题?什么是解决此问题的好方法?我开始考虑提供服务这些文件的tomcat安装并通过http读取它们,但我认为这太多了,这就是为什么SMB协议首先用于它的原因不是吗?也许我无论如何都无法打开插座。
安全管理器是否可能是原因(我之前从未使用过,但我知道它存在)
如果情况确实如此,那么会抛出SecurityException吗?
非常感谢。
修改
解决。谢谢Steve W。
事实证明,此引擎是使用ZeroG的“LaunchAnywhere”启动的。因此,创建一个.exe,然后将使用指定的应用程序运行JVM。
这个应用程序本身就是Launcher。当它启动引擎时,不知何故(我无法弄清楚为什么或如何)拥有JVM进程的用户是SYSTEM。史蒂夫指出,该用户没有NETWORK访问权限,因此无法从共享资源或映射驱动器读取。
解决方法(当我向制造商报告时)是创建一个.cmd文件来手动启动引擎。由于它是手动启动的,因此用户可以访问网络。
我使用了SysInternals的“Process Explorer”来确切地知道用于运行引擎应用程序的命令行。
什么是MESS!
感谢那些发布答案的人。
答案 0 :(得分:5)
共享资源是否受用户名和密码保护?如果是这样,您的应用程序引擎是否以该用户身份运行?如果您的应用程序引擎作为Windows服务运行,则Windows服务无法作为“本地系统帐户”运行。此帐户无法访问网络。您必须将服务配置为以具有访问共享驱动器权限的用户身份运行。
答案 1 :(得分:0)
仔细检查该文件是否真的被称为“MyFileHere.txt”,而不是“MyFileHere.txt.txt” 如果你隐藏了文件的扩展名,那么很容易错过
答案 2 :(得分:0)
您是否检查过服务器上的事件日志以查看它是否被拒绝? 可能是程序在不同的用户帐户下运行。
我不熟悉Java,但我知道我编写的一些程序我必须允许网络服务访问资源。
实际上,我发现你现在已经选择了正确答案。 哦,这和我的回答一样:)很酷!
答案 3 :(得分:0)
我曾遇到过类似的问题。我认为这与java解析远程文件URI的方式有关。尝试以下操作,看看它是否有效:
文件:////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()));
}