2009-01-28 115 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())); 
} 
相關問題