【问题标题】:FileNotFoundException thrown when the file does exists当文件确实存在时抛出 FileNotFoundException
【发布时间】:2009-01-28 04:37:15
【问题描述】:

我正面临这个奇怪的问题。

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

\\remote-machine\dir\MyFileHere.txt

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

虽然我会获得某种权限,所以我将资源映射为驱动器:K:\

重新运行我的 java 文件,读取,很好。

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

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

问题

可能导致此 FileNotFoundExcecption 的原因是什么?

我使用的是 Java 1.5

据我所知,引擎几乎透明地使用 java。

有人遇到过类似的事情吗?

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

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

如果是这种情况,难道不会抛出 SecurityException 吗?

非常感谢。

编辑

解决了。谢谢史蒂夫 W。

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

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

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

我使用 SysInternals 的“Process Explorer”来准确了解用于运行引擎应用程序的命令行。

真是一团糟!

感谢那些发布答案的人。

【问题讨论】:

    标签: java jvm io filenotfoundexception smb


    【解决方案1】:

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

    【讨论】:

    • 1stq:确实如此。 2ndq:不是。 3rd 不是服务,但仔细看,启动器是以本地用户身份运行的,但是这个启动器(好吧)启动用户是 SYSTEM 的引擎应用程序(因此不允许使用网络):-/ 我要看看这个启动器是如何可以不以 SYSTEM 身份启动应用程序吗?
    • 我正在查看“引擎”是使用 LaunchAnywhere 启动的(从 zerog 开始)我不知道它是如何使用 SYSTEM 启动新 VM 的:-/
    • 这个答案给出了解决问题的提示。非常感谢。
    【解决方案2】:

    仔细检查文件是否真的被称为“MyFileHere.txt”而不是“MyFileHere.txt.txt” 如果您隐藏文件的扩展名,这是一个容易错过的错误

    【讨论】:

    • 但是话又说回来,我并没有真正阅读您的整个问题。我只记得上面提到的问题发生了,我正在为某人调试问题而挠头
    • 双重和超三重检查。还有空格等。我什至对java文件中的路径进行了硬编码,它使用java TestRead运行正常。但是当 TestRead 类加载到引擎中时,它会抛出 FNFE。
    【解决方案3】:

    您是否检查过服务器上的事件日志以查看它是否被拒绝? 可能是程序在与您想象的不同的用户帐户下运行。

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

    实际上,我看到您现在已将答案标记为正确答案。 哦,这和我的回答一样:)酷!

    【讨论】:

    • jejej Yeap.. 非常感谢。其实你的推论很接近。我对自己的 Windows 服务不是很了解,这让我感到意外。但我终于在史蒂夫的建议下得到了一个很好的暗示。噗。还是谢谢。
    【解决方案4】:

    我曾经遇到过类似的问题。我认为这与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()));
    }
    

    【讨论】:

    • 谢谢伊戈尔。事实并非如此,因为在引擎内部和外部使用了相同的“路径”。问题是虚拟机是使用没有网络资源访问权限的用户 SYSTEM 创建的。不过感谢您的回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多