2014-08-31 54 views
0

我的文件下projectRoot/src/main/resources/levels/訪問的src /主/資源/動態地從源代碼

enter image description here

位於如果我把Utils.getFileNamesInDirectory("src/main/resources/levels"),它的工作原理。
但是,當項目打包時,levels目錄被放置在.jarroot下。
如何在靜態類中創建這種動態?即src/main/resources/
因此,代碼將在eclipse中運行,並作爲獨立的jar。

代碼以列出目錄中的文件..

public class Utils { 
    public static List<String> getFileNamesInDirectory(String directory){ 

     List<String> results = new ArrayList<String>(); 

     File[] files = new File(directory).listFiles(new FilenameFilter() { 
      public boolean accept(File dir, String filename) { 
       return filename.endsWith(".json"); 
      } 
     }); 

     for (File file : files) { 
      if (file.isFile()) { 
       results.add(file.getName()); 
      } 
     } 

     Collections.sort(results); 

     return results; 
    } 
} 

更新

我搬到使用getResourceAsStream(如getResource是導致IllegalArgumentException: URI is not hierarchical),我能夠在列出的文件目錄在Eclipse之內。

public static List<String> getFileNamesInDirectory(String directory){ 

     List<String> results = new ArrayList<String>(); 
     InputStream in = Utils.class.getResourceAsStream("/" + directory); 
     BufferedReader rdr = new BufferedReader(new InputStreamReader(in)); 
     String line; 

     try { 

      while ((line = rdr.readLine()) != null) { 
       System.out.println("file: " + line); 
       results.add(new File(line).getName()); 
      } 

      rdr.close(); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 

     Collections.sort(results); 

     return results; 
    } 

但是當我運行它作爲獨立的.jar我得到這條線以下錯誤:while ((line = rdr.readLine()) != null) {
爲什麼它不能正常工作之外Eclipse

Exception in thread "main" java.lang.NullPointerException 
    at java.io.FilterInputStream.read(FilterInputStream.java:133) 
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:322) 
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:364) 
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:210) 
    at java.io.InputStreamReader.read(InputStreamReader.java:205) 
    at java.io.BufferedReader.fill(BufferedReader.java:165) 
    at java.io.BufferedReader.readLine(BufferedReader.java:328) 
    at java.io.BufferedReader.readLine(BufferedReader.java:393) 
    at com.app.tools.Utils.getFileNamesInDirectory(Utils.java:31) 
+1

你不知道。 '/ src/main/resources'是Maven使用的一個** project **目錄約定,用於包含最終生成的歸檔/類路徑根目錄下的資源。 – 2014-08-31 18:55:44

+0

在eclipse中你也應該使用類路徑而不是文件系統。 – 2014-08-31 18:56:00

+0

我知道'src/main/resources'是'Maven'的目錄約定。你有沒有在文件系統上使用類路徑的例子? – bobbyrne01 2014-08-31 19:02:27

回答

2

你的代碼工作在Eclipse的原因是Eclipse的從項目目錄啓動java過程,我們可以假設在

提供的路徑
Utils.getFileNamesInDirectory("src/main/resources/levels") 

是相對於當前的工作目錄(項目目錄)。由於文件系統位置<project-directory>/src/main/resources/levels存在,因此可以找到並返回給您。

src/main/resources是一個Maven約定,用於保存在編譯/構建/部署項目時最終會在類路徑中結束的資源。要從類路徑檢索資源,請使用Class#getResource(String),ClassLoader#getResource(String)和/或ClassLoader#getSystemResource(String)

現在,although there are ways to list resources in the classpath,你通常不應該這樣做。如果你需要一個資源,你可以通過名字知道它,因此可以使用上面列出的方法之一來獲取它。

+0

我不再使用文件系統方法,而是使用'getResourceAsStream',但仍然有問題,有什麼想法?更新後的問題 – bobbyrne01 2014-08-31 23:00:21

+0

@ bobbyrne01如果找不到匹配的資源,則'getResourceAsStream'返回'null'。你的'.jar'包含右邊(指定)路徑的資源嗎? – 2014-08-31 23:16:49

+0

.jar具有'/ levels'文件夾,即.jar的根目錄。我將'/ levels'傳遞給'getResourceAsStream' – bobbyrne01 2014-08-31 23:24:11