2010-10-02 232 views
83

我有2包的項目:如何從Java項目中的相對路徑讀取文件? java.io.File中找不到指定的路徑

  1. tkorg.idrs.core.searchengines
  2. tkorg.idrs.core.searchengines

在包(2)我有一個文本文件ListStopWords.txt,在包(1)我有一個類FileLoadder。下面是代碼FileLoader

File file = new File("properties\\files\\ListStopWords.txt"); 

但是有這樣的錯誤:

The system cannot find the path specified 

可以給你解決這個問題的解決方案?謝謝。

+5

您的兩個包示例都是相同的。你是不是指'2'的'properties.files'? – BalusC 2010-10-02 03:58:56

回答

119

如果它已經在classpath中,那麼就從classpath獲得它。不要在java.io.File中擺弄相對路徑。它們依賴於當前工作目錄,在Java代碼中完全沒有任何控制。

假設ListStopWords.txt是在同一個包爲FileLoader類:

URL url = getClass().getResource("ListStopWords.txt"); 
File file = new File(url.getPath()); 

或者,如果所有你後是它的一個InputStream

InputStream input = getClass().getResourceAsStream("ListStopWords.txt"); 

如果文件是 - 作爲包名hints-是實際上一個fullworthy properties file(含key=value線)只用「錯誤」的延伸,那麼你可以給它IMM適用於load()方法。

Properties properties = new Properties(); 
properties.load(getClass().getResourceAsStream("ListStopWords.txt")); 

注意:當你試圖從內部static背景下訪問它,然後用FileLoader.class代替getClass()在上面的例子。

+0

FileLoader從java中刪除?我試圖從一個靜態的上下文(Java 6)做到這一點,我找不到任何方式來導入它,它一直告訴我它不能解析爲一個類型。奇怪的是,我輸入它時自動完成,但後來給我一個錯誤。 – turbo 2013-10-07 18:57:50

+1

哦,它應該是ClassLoader.class。 – turbo 2013-10-07 19:12:41

+4

@turbo:'FileLoader'是OP自己定製的類。它應該是正是那個你正試圖獲得資源的階級。因此,所以'NameOfYourCurrentClass.class.getResourceAsStream(...)'。如果ClassLoader類被不同的類加載器加載,而ClassLoader.class類可能發生在具有多個類加載器的層次結構的「企業」應用程序(如Java EE Web應用程序)中,則ClassLoader.class將失敗。 – BalusC 2013-10-07 19:30:50

3

嘗試.\properties\files\ListStopWords.txt

4
InputStream in = FileLoader.class.getResourceAsStream("<relative path from this class to the file to be read>"); 
    try { 
     BufferedReader reader=new BufferedReader(new InputStreamReader(in)); 
     String line=null; 
      while((line=reader.readLine())!=null){ 
       System.out.println(line); 
      } 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
+1

什麼是FileLoadder? – 2015-05-01 16:59:50

+1

@IgorGanapolsky它的類的名稱。您只能通過提供其類的全名來引用'.class'文字。 – Tomasz 2016-01-03 21:37:31

+0

我認爲它打算成爲FileLoader。 – jamesdeath123 2016-01-26 02:57:06

26

如果我們要指定文件的相對路徑,可以使用以下行。

File file = new File("./properties/files/ListStopWords.txt"); 
+3

我可以知道爲什麼在路徑之間有3個斜線。 – 2014-11-11 08:54:15

+0

錯誤:>字符串文字中的非法轉義字符。 – 2015-05-01 16:58:14

+0

如何將其轉換爲'InputStream'? – 2016-03-22 20:35:52

-1

如果你想打電話getClass()從靜態方法或靜態塊,你可以做以下的方法。

你可以要裝載到Properties對象調用getClass()

public static Properties pathProperties = null; 

static { 
    pathProperties = new Properties(); 
    String pathPropertiesFile = "/file.xml; 
    InputStream paths = pathProperties.getClass().getResourceAsStream(pathPropertiesFile); 
} 
+0

只是缺少結束報價。 – jamesdeath123 2016-01-26 02:57:36

2

雖然由BalusC提供的答案適用於這種情況下,它會在文件路徑中包含空格,因爲在一個URL,這些都被轉換爲20%,這不是一個有效的文件名突破。如果使用URI而不是字符串構造File對象,則可以正確處理空格:

URL url = getClass().getResource("ListStopWords.txt"); 
File file = new File(url.toURI()); 
9

相對路徑在java中使用。運營商。

  • 。意味着與當前運行的上下文相同的文件夾
  • ..表示當前正在運行的上下文的父文件夾。

所以問題是如何知道java當前正在查找的路徑?

做一個小實驗

File directory = new File("./"); 
    System.out.println(directory.getAbsolutePath()); 

觀察輸出,你會知道在哪裏Java是尋找當前目錄。從那裏,只需使用./運算符來查找您的文件。

例如,如果輸出

G:\JAVA8Ws\MyProject\content.

和你的文件存在於文件夾中MyProject的簡單的使用

File resourceFile = new File("../myFile.txt"); 

希望這有助於

-1

如果文本文件不被讀取,嘗試使用更接近的絕對路徑(如果您希望 您可以使用完整的絕對路徑),如下所示:

FileInputStream fin=new FileInputStream("\\Dash\\src\\RS\\Test.txt"); 

假設絕對路徑是:

C:\\Folder1\\Folder2\\Dash\\src\\RS\\Test.txt 
0

我想分析的src/main // JS/Simulator.java內 'command.json'。爲此,我將json文件複製到了src文件夾中,並給出瞭如下絕對路徑:

Object obj = parser.parse(new FileReader("./src/command.json")); 
相關問題