2011-08-17 109 views
3

我有巨大難以寫入Java中的簡單文本文件。我爲IO異常所做的每一次搜索都提出了很多建議,但沒有一個適用於這種情況。在Java中寫入文件:找不到指定的路徑

這裏是我的項目結構:

MyEclipseProject/ 
    src/ 
     com.myprogram.utils 
      MyProgram 
    bin/ 

而且我對MyProgram.java代碼:

package com.myprogram.utils; 

import java.io.FileWriter; 

public class MyProgram 
{ 
    public static void main(String[] args) 
    { 
     FileWriter oWriter = new FileWriter(new File("logs/system.log")); 
     oWriter.write("This never gets logged because JRE can't find the file"); 
    } 
} 

我得到狀態異常消息:日誌\ SYSTEM.LOG(系統找不到指定的路徑)

我第一次嘗試時,我沒有先創建logs/目錄及其後續日誌文件。我的理解是,如果Java找不到該文件,它會爲您創建它。

我現在已經置於logs文件夾 - 用空白system.log文件 - 內:(1)我的項目根(MyEclipseProject),(2)src/文件夾,(3)src/com.myprogram.utils包,和(4)bin文件夾,我得到相同的確切的錯誤。我想知道:我可以有一個操作系統/執行的事情嗎?我的應用可能是,嘗試使用來創建文件夾和日誌文件,但Windows 7會拒絕這樣做的權限?如果是這樣,我該怎麼辦?!?!

如果不是,請問我在哪裏放置logs/system.log ???

謝謝你對此的任何澄清!

+0

你在幹什麼? – Shawn

+0

你會嘗試將文件名更改爲system.log,併發佈會發生什麼? –

回答

6

要看看你是在哪個目錄,添加下面的print語句:

System.out.println(new File(".").getAbsolutePath()); 

這會告訴你,你應該創建logs目錄。

+0

謝謝你的迴應!我遵循你的建議,並找到了正確的目錄來放置所有內容。*但是,我現在正面臨一個單獨的問題:每次運行我的程序時,都會創建一個新版本的日誌文件;完全覆蓋之前在其中的任何數據。爲了使事情變得更加複雜,它使用空白(0字節)文件覆蓋以前的文件 - 實際上沒有記錄。但我沒有得到任何檢查/未檢查的例外....想法? – IAmYourFaja

+0

@Mara您需要使用append選項創建'FileWriter',以便它附加到文件而不是覆蓋它。你寫完之後還需要'flush()'和'close()'作者。 – dogbane

+0

@Mara另外,請使用'BufferedWriter'。查看File IO教程http://download.oracle.com/javase/tutorial/essential/io/file.html,瞭解寫入文件的正確方法。 – dogbane

0

嘗試的BufferedWriter

public static void main(String[] args { 

String filename = "C:\\mynewtextfile.txt"; 
FileWriter fstream; 
    try { 
    fstream = new FileWriter(filename); 
    BufferedWriter out = new BufferedWriter(fstream); 
      out.write("My Name is Bobby"); 
      out.newLine(); 
      out.write("This is my text file.");      
      out.flush(); 
      out.close(); 
     } 
    catch (IOException e) { 
      e.getClass(); 
     } 

}

0

您使用的路徑與當前工作目錄相關。你當前的工作目錄取決於你如何運行你的應用程序。我想這是MyEclipseProject。因此,您必須在您的項目下創建目錄log(與srcbin目錄所在的同一級別),然後在此目錄中創建文件system.log。然後再試一次。我相信你的代碼將開始工作。

它在寫入文件之前不會嘗試打印new File("logs/system.log").getAbsolutePath()。它會告訴你係統希望看到你的文件的位置。

0

當在現代文件系統上創建文件路徑時(至少,這對Windows,Mac以及我熟悉的Linux的風格都是如此),有絕對路徑和相對路徑。絕對路徑是通過文件系統到您正在查找的特定文件的路徑,如C:\Program Files\Application\application.exe。相對路徑相對於當前位置(如暗示)。

如果我運行main()與線 '的System.out.println(新文件()getAbsolutePath() 「」);',例如,我得到的輸出

C:\my-workspace\myproject\.

.代表當前目錄。這就是爲什麼你可以使用它來找到應該在哪裏創建目錄。

如果Java無法找到該文件,那麼它將創建該文件,但該目錄與此不同。您必須在運行代碼之前或使用File#mkdir()方法在代碼本身中創建目錄。

0

取決於您如何調用應用程序,但是您應該在項目根目錄中創建日誌目錄,並且應該能夠在其中寫入文件。

Java在打開流時不會自己創建該目錄。

您可能有權限問題。試試:

System.out.println("can write: " + new File(./logs).canWrite()); 
相關問題