2014-10-08 137 views
1

我創建了一個簡單的程序,將使用下面的代碼寫一個目錄中的文件的特定目錄:將文件寫入

String nameProve = nameField.getText(); 

String employee = ("C:\\Users\\ALLEN\\workspace32bit\\RETRIEVE_CHECKER1\\RETRIEVE_CHECKED1" + nameProve + ".txt"); 

PrintWriter outputStream1 = null; 
try 
{ 
    outputStream1 = new PrintWriter(employeeName); 
} 
catch(Exception e) 
{ 
    JOptionPane.showMessageDialog(null, "Can not write to " + employeeName); 
    System.exit(0); 
} 

outputStream1.println("Employee Retrieve Executed"); 
outputStream1.close(); 

我已經導出我的代碼到一個.jar文件和我的代碼工作得很好,如果我在計算機中執行它,我已經開發了我的程序,但是當我將jar文件複製到其他計算機上時,我還創建了與我的代碼中的目錄相對應的forlder(手動) t工作,我的catch塊將顯示消息不能寫入「C:\ Users \ ALLEN \ workspace32bit \ RETRIEVE_CHECKER1 \ RETRIEVE_CHECKED1」+ nameProve +「.txt」

有人可以給我一些關於如何解決這個錯誤的建議嗎?謝謝!

+0

你能提供您收到的異常? – 2014-10-08 09:27:01

+0

無法寫入到C:\ Users \ ALLEN \ workspace32bit \ RETRIEVE_CHECKER1 \ RETRIEVE_CHECKED1Edward.txt「,並且在我單擊確定後程序退出並且寫入方法沒有執行。 – user3796035 2014-10-08 09:55:33

+0

在RETRIEVE_CHECKED1之後和Edward之前應該有一個斜槓。 txt',否則找不到位置 – 2014-10-08 10:40:48

回答

0

很明顯,您是您的機器上的用戶ALLEN並以該用戶的身份運行該程序,因此您可以正常工作,因爲您是目錄C:\Users\ALLEN的所有者。

然後你的jar複製到另一臺機器,用戶ALLEN不存在,並您登錄爲用戶antoher比方說他的名字是Bob並創建目錄溫特C:\Users。您可能已經注意到,當您想要創建該目錄時,用戶Bob窗口已警告您需要管理員權限才能完成此操作。

現在,您嘗試與只能訪問他自己的目錄C:\Users\Bob的用戶Bob一起運行程序,並嘗試寫入ALLEN的自己的目錄。所以會發生什麼是你得到一個IOException告訴你access denied這是好事!

你不應該寫信給其他用戶的私人註冊表,這是一個安全問題。

在你的代碼處理文件系統時,從不硬編碼絕對路徑,總是使用相對路徑,或者如果你需要定義一個你需要編程所需的所有數據的direcotry應該被定位,然後傳遞ist作爲參數。

做最簡單的,IST使用以下,並與工作電流working directory

String employee = "RETRIEVE_CHECKER1\\RETRIEVE_CHECKED1" + nameProve + ".txt"; 

則需要由在位置的手,你在你的程序運行的程序,或更好,但創建目錄RETRIEVE_CHECKER1使用File#mkdir,並使用它是這樣的:你趕上

File employee = new File(dir, "RETRIEVE_CHECKED1" + nameProve + ".txt"); 
PrintWriter outputStream1 = new PrintWriter(employeeName); 
+0

感謝man ......不熟悉計算機名稱和安全問題,這對我有很大的幫助 – user3796035 2014-10-09 00:20:44

+0

我嘗試了一種具有相同目錄路徑的閱讀方法,我手動複製.txt文件到另一個站當我運行我的程序已被導出到一個jar文件它工作它讀取文件,我使用相同的文件目錄,任何解釋爲什麼我的閱讀方法工作,而不是我的寫作方法? – user3796035 2014-10-09 00:32:48

+0

@ user3796035計算機上的用戶在不同的資源上被授予訪問權限,最常見的權限是'read','write'和'execute',前兩個是顯而易見的,第三個是用於運行一個可執行文件。如果您查看您能夠閱讀的文件的屬性或您可以在安全選項卡中閱讀的目錄,則可以找到可以訪問該文件的用戶,方法是選擇一個用戶,您將看到哪些權限是授予他。你可以在這裏找到更多關於這個主題的文章(http://en.wikipedia.org/wiki/File_system_permissions)。 – A4L 2014-10-09 06:41:39

0

異常將所有詳情 - 像拒絕訪問,目錄不存在,等等。目前你失去的異常數據(消息,堆棧跟蹤)當c處理它。

請這樣做

  • 不要捕捉只是java.lang.Exception的。這是太寬 - 將抓到可能空指針異常和目前的誤導性消息'「無法寫入'。只捕獲特定的異常,而不是實際從try塊拋出的異常。在你的情況,這將是java.io. FileNotFoundException
  • 不要丟失異常的細節。它打印到標準錯誤日誌,甚至更好的使用登錄電子框架

catch塊不會忽略這些問題:

catch(FileNotFoundException e) { 
    JOptionPane.showMessageDialog(null, e.getMessage()); 
    e.printStackTrace(); 
}