2009-01-28 123 views
3

我正面临着这个奇怪的问题。当文件存在时抛出FileNotFoundException

我试图读取位于在另一台机器作为共享资源文件:

\\remote-machine\dir\MyFileHere.txt 

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

我以为我是某种权限,所以我映射资源作为一个驱动器:K:\

重新运行我的Java文件,读取,罚款。

在“引擎” - > FileNotFoundException中重新运行我的java文件。

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

问题

什么可能会导致此FileNotFoundExcecption?

我使用Java 1.5

据我所知发动机几乎使用Java透明。

任何人都面临类似的东西?

其他问题?什么是解决这个问题的好办法?我开始考虑通过http服务这些文件并通过http读取它们的tomcat安装,但我认为这太多了,这就是为什么SMB协议首先是为了不是吗?无论如何,我可能无法打开套接字。

是否安全管理器可能是原因(我从来没有使用之前,但我知道它的存在)

Wound't一个SecurityException而不是抛出如果会出现这种情况?

非常感谢。

编辑

解决。谢谢Steve W.

事实证明,这个引擎是从ZeroG的“LaunchAnywhere”启动的。所以,一个.exe被创建,反过来将运行一个JVM与指定的应用程序。

这个应用程序它本身就是启动器。当它启动引擎时,以某种方式(我无法弄清楚为什么或如何)拥有JVM进程的用户是SYSTEM。正如Steve指出的那样,该用户没有NETWORK访问权限,因此无法从共享资源或映射驱动器读取数据。

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

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

什么是好消息!

感谢那些发布答案的人。

回答

5

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

+0

1stq:它的确如此。 2ndq:不是。第三不是服务,但仔细观察,启动程序以本地用户身份运行,但此启动程序(好)启动了其用户为SYSTEM的引擎应用程序(因此不允许使用网络): - /我是否看到此启动器可以启动应用程序不是作为系统? – OscarRyz 2009-01-28 04:53:36

+0

我正在看“引擎”是从LaunchAnywhere(来自zerog)开始的,我不知道它是如何使用SYSTEM启动新VM的: -/ – OscarRyz 2009-01-28 05:13:47

+0

这个答案给出了解决问题的提示。非常感谢。 – OscarRyz 2009-01-28 05:39:17

0

仔细检查该文件真的叫“MyFileHere.txt”,而不是“MyFileHere.txt.txt” 如果你是隐藏文件的进一步扩展,这是一个容易犯的错误错过

+0

但是,再一次,我没有真正阅读你的整个问题。我只记得上面提到的问题发生了,并且我正在为了调试某个人的问题而挠了挠头。 – 2009-01-28 05:04:31

0

你检查事件会在服务器上登录以查看它是否被拒绝? 它可能是该程序在不同的用户帐户下运行比您想象的。

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

其实我看到你现在勾选了一个正确答案。 哦,这是我的回答相同:)很酷!

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())); 
} 
相关问题