2009-01-12 30 views
51

所以我2009年的新年決議是學習Java。我最近收購了「Java for Dummies」,並通過使用Eclipse重寫本書中的示例代碼。無論如何,書中使用相對路徑的每個示例似乎都沒有讀取它應該讀取的.txt文件。相對文件路徑在Eclipse中如何工作?

下面是示例代碼:

import java.util.Scanner; 
import java.io.File; 
import java.io.IOException; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import java.awt.GridLayout; 

class TeamFrame extends JFrame { 

    public TeamFrame() throws IOException { 
     PlayerPlus player; 
     Scanner myScanner = new Scanner(new File("Hankees.txt")); 

     for (int num = 1; num <= 9; num++) { 
      player = new PlayerPlus(myScanner.nextLine(), myScanner.nextDouble()); 
      myScanner.nextLine(); 
      addPlayerInfo(player); 
     }  

     add(new JLabel()); 
     add(new JLabel(" ------")); 
     add(new JLabel("Team Batting Aberage:")); 
     add(new JLabel(PlayerPlus.findTeamAverageString())); 
     setTitle("The Hankees"); 
     setLayout(new GridLayout(11,2)); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     pack(); 
     setVisible(true); 
    } 

    void addPlayerInfo(PlayerPlus player) { 
     add(new JLabel(player.getName())); 
     add(new JLabel(player.getAverageString())); 
    } 
} 

而且你可以在下面的屏幕截圖我已經包含了這個文件中看到。

圖像不再

另外,我還證實,當我構建Hankees.txt的副本放置在bin文件夾與編譯後的class文件的應用程序。

最後,如果我將第12行更改爲以下內容並將Hankees.txt放在我的C:\驅動器的根目錄中,則該程序編譯並運行正常。

Scanner myScanner = new Scanner(new File("C:\\Hankees.txt")); 

所以基本上,我的問題是我做錯了什麼?或者Eclipse是以某種方式對此負責的?

感謝您的幫助!

+1

tangential評論:我很抱歉任何書中標題中有「傻瓜」的書。試試Bruce Eckel的「Thinking in Java」或者Niemeyer&Knudsen的「Learning Java」,兩者都非常好。 – 2009-01-12 23:45:35

+0

上次我檢查了Java for Dummies,它是基於Java 1.2的。他們最近是否更新過? – 2009-01-13 21:20:49

回答

69

你需要"src/Hankees.txt"

您的文件是在其中不計入工作目錄的源文件夾。\

或者您也可以將文件移動到你的項目的根目錄下,只需使用"Hankees.txt"

+0

是的,工作!你能解釋爲什麼會發生?最後,該文件位於存儲.class文件的src文件夾中,爲什麼我必須再次定義src文件夾? – PHLAK 2009-01-12 23:23:40

+4

嗯,我相信通過設計eclips使您的項目的頂級目錄的程序的工作目錄。我不知道他們爲什麼這樣做。許多人擁有/ bin和/ src文件夾,因此/ src不在.class文件所在的位置。 – jjnguy 2009-01-12 23:27:43

5

是的,爲了路徑的目的,eclipse將頂層目錄視爲工作/根目錄。

...只是想我會添加一些額外的信息。我是新來的!我想幫忙。

7

項目的構建路徑定義將源文件夾中的哪些資源複製到輸出文件夾。通常這被設置爲包含所有文件。

新的運行配置默認使用工程目錄的項目目錄,但這也可以更改。

這段代碼顯示及所在班級從加載位置的工作目錄之間的差異,:

public class TellMeMyWorkingDirectory { 
    public static void main(String[] args) { 
     System.out.println(new java.io.File("").getAbsolutePath()); 
     System.out.println(TellMeMyWorkingDirectory.class.getClassLoader().getResource("").getPath()); 
    } 
} 

輸出很可能是這樣的:

C:\your\project\directory 
/C:/your/project/directory/bin/ 
7

這是與另一個問題非常相似。 How should I load files into my Java application?

我應該如何將我的文件加載到我的Java應用程序中?

要加載的文件:

C:\your\project\file.txt 

這是壞了!

您應該使用getResourceAsStream。

InputStream inputStream = YourClass.class.getResourceAsStream(「file.txt」); 

,你也應該使用文件分割符;這是與系統相關的名稱分隔符,爲方便起見,用字符串表示。

1

我有同樣的問題。如果YourClass和Hankees.txt在您的項目中有一個目錄,那麼我會發現以下 - 並不是很糟糕。

import java.net.URL; 
//<...> 
URL url = YourClass.class.getClassLoader().getResource("Hankees.txt"); 
String filesPathAndName = url.getPath();   
Scanner myScanner = new Scanner(new File(filesPathAndName)) 
//<...> 
1

你總是可以通過讓你的運行路徑:

String path = new File(".").getCanonicalPath(); 

這提供了關於在何處放置文件和資源的重要信息。