2015-06-22 84 views
1

我試圖取代使用文件和FileReaders的所有實例,並與InputStreams和適當的閱讀器替換它們,準備在一個罐子包裝的應用程序 - 但是,當我嘗試使用ClassLoader.getSystemClassLoader().getResourceAsStream()與File方法找到的路徑相同,但由於無法找到文件而失敗。嘗試使用的getResourceAsStream()和失敗

我使用的代碼和輸出:

文件中的文本:

e:Easy 
definitions/easy_level_definitions.txt 
h:Hard 
definitions/hard_level_definitions.txt 
d:Derp 
definitions/derp_level_definitions.txt 

代碼:

String line; 
    File f = new File("src/resources/level_sets.txt"); 
    BufferedReader reader1 = null; 
    try { 
     reader1 = new BufferedReader(new FileReader(f)); 
     while ((line = reader1.readLine()) != null) { 
      System.out.println(line); 
     } 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if (reader1 != null) { 
       reader1.close(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    line = null; 
    InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("src/resources/level_sets.txt"); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
    try { 
     while ((line = reader.readLine()) != null) { 
      System.out.println(line); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if (reader != null) { 
       reader.close(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

輸出:

e:Easy 
definitions/easy_level_definitions.txt 
h:Hard 
definitions/hard_level_definitions.txt 
d:Derp 
definitions/derp_level_definitions.txt 
Exception in thread "main" java.lang.NullPointerException 
    at java.io.Reader.<init>(Unknown Source) 
    at java.io.InputStreamReader.<init>(Unknown Source) 
    at Testing.main(Testing.java:34) 
+0

感謝球員們,以前試過用文件,它沒有工作,並沒有認爲它對他們的工作方式不同。無論如何,它可以工作,如果我刪除'src/resources /'部分,非常感謝。 – Sunspawn

+0

你爲什麼使用你的系統類加載器呢? –

+0

這是班級教員(大學課程)的建議。我相信當從jar之外的源代碼運行jar時,允許通過命令行提供額外的級別集。 另外,''/level_sets.txt''在''level_sets.txt''工作時似乎不起作用。任何解釋爲什麼? – Sunspawn

回答

2

「src」文件夾僅在您的IDE中可用。一旦應用程序被打包,它就不會再存在,資源將在類路徑的根目錄中可用。使用這個:

InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("/level_sets.txt"); 
2

這是很難知道,因爲它看起來像e你沒有使用標準的Maven風格的目錄,它並不完全清楚你的類路徑是什麼,但它看起來應該使用/level_sets.txt或者/src/level_sets.txt而不是src/resources/level_sets.txt。參數是在類路徑中給出資源的位置,src目錄似乎不太可能是類路徑的一部分,並且目前還不清楚resources是否會。

前面的斜線表示直接看到類路徑的根目錄下。

作爲構建過程通常將文件從一個src目錄複製到目標目錄的一部分(可能被命名爲binclasses)。您的代碼需要相對於目標目錄,而不是在src之下。

1
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("src/resources/level_sets.txt"); 

您的路徑以「src /」開頭。嘗試用二進制文件夾(bin或classes)替換它。