2013-07-21 205 views
2

嗨,我已經將我的java項目導出爲可執行jar文件。在我的項目內我正在訪問包含一些數據的Excel文件。現在,當我試圖訪問文件時,我無法訪問Excel文件。
如何訪問jar文件中的資源(Excel文件)

我的項目結構爲:
Java_Project_Folder
- SRC_FOLDER
- resources_Folder(含Excel文件)

我訪問Excel文件一樣

FileInputStream file=new FileInputStream(new File(System.getProperty("user.dir") 
+File.separator+"resources"+File.separator+"Excel.xlsx")); 

我曾嘗試使用getResourceAsStream訪問此文件:

FileInputStream file=(FileInputStream) this.getClass().getResourceAsStream 
("/resources/Excel.xlsx"); 

但我越來越是空例外。有什麼不對?

+0

你能提供更多的信息嗎?通常,您的資源文件夾不應位於代碼src文件夾內。 – torquestomp

+0

第二個片段位於正確的軌道上,除非您不會獲得FileInputStream,因爲資源位於jar中,但是是InputStream。向我們展示jar文件的內容(使用jar tvf yourfile.jar) –

+0

@torquestomp:爲什麼不應該這樣做,因爲OP希望這個文件夾成爲jar文件的一部分? –

回答

0

我嘗試這樣做,這是爲我工作。

我的Test1類是默認的包,只是檢查您的訪問類的任何程序包如果是則返回到準確的資源文件夾,從classpath中像這樣「../」

public class Test1 { 

    public static void main(String[] args) { 
     new Test1(); 
    } 
    Test1(){ 
     BufferedInputStream file= (BufferedInputStream) this.getClass().getResourceAsStream("resources/a.txt"); 
     try { 
      System.out.println((char)file.read()); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

} 
+0

我試過你的解決方案。它從我的Java項目運行。但是當我將它導出到jar文件時,它不起作用。任何想法爲什麼它不工作? –

+0

從Eclipse創建Jar時,確保您正在選中「添加目錄條目」複選框,您可以檢查一次。 – Jayesh

+0

你是如何創建JAR文件的?嘗試使用Eclipse創建一次,如果您不是通過Eclipse創建的並右鍵單擊 - >導出爲 - > JAR文件 - >打開框時,您可以看到底部添加目錄條目,選中該框,默認未選中。嘗試一次。 – Jayesh

2

第一步是將excel文件本身包含在您的項目中。您可以像創建資源文件夾一樣創建資源文件夾,但爲了確保將其包含在jar文件中,需要將資源文件夾與源代碼文件一起添加,以便將其內置到jar中。

然後

InputStream excelContent = this.getClass().getResourceAsStream("/resources/Excel.xlsx"); 

應該工作。至少從一篇文章來看,如果你使用ClassLoader,那麼前面的正斜槓也可能會讓你感到困惑。

getClass().getResourceAsStream("https://stackoverflow.com/a/b/c.xml") ==> a/b/c.xml 
getClass().getResourceAsStream("a/b/c.xml") ==> com/example/a/b/c.xml 
getClass().getClassLoader().getResourceAsStream("a/b/c.xml") ==> a/b/c.xml 
getClass().getClassLoader().getResourceAsStream("https://stackoverflow.com/a/b/c.xml") ==> Incorrect 

裁判:getResourceAsStream fails under new environment?

而且在Eclipse中可以設置的資源文件夾這樣的源文件夾:

在Eclipse項目的屬性

,轉到Java構建路徑,選擇來源,並檢查是否添加了所有需要的源代碼(作爲源文件夾)。如果某些缺失,只需添加它們使用手動添加源...按鈕

裁判:Java Resources Folder Error In Eclipse

+0

嗨@Ted我使用eclipse通過提取所有需要的庫生成jar文件來生成可運行jar文件。現在我應該如何使eclipse將資源文件夾包含到生成的jar文件中? –

+0

如果您將rsc標記爲源文件夾,Eclipse會將其內容複製到輸出目錄。或者,如果您想將輸出中的資源分組,可以在src下移動rsc。 – Ted

1

我打賭你沒有在你的項目中叫resources的包。

試圖使用Class.#getResourceAsStream是要走的路。但是這種方法不會返回FileInputStream。它返回一個InputStream這是一個接口。

你應該通過在Excel文件所在的目錄

resources/my/pack/age 
+0

你是正確的,似乎資源文件夾沒有出口。我已經嘗試從eclipse中導出我的java項目作爲可運行jar文件,通過將所有必需的庫提取到生成的jar文件中。我應該如何將我的資源文件夾包含在導出資源中的jar文件中作爲可運行jar文件通過eclipse? –

+0

@MrunalGosar在eclipse中定義的任何其他forlder作爲源文件夾的文件夾'src'和'resources'永遠不會導出到jar文件。其目的僅限於組織。導出的是包。所以如果你在文件夾resources中有一個'foo.bar'包,那麼只有'foo/bar'會被導出,並且對'getResourceAsStream'的調用必須以'foo/bar'開頭而不是'resources/foo/bar '。如果您導出孔項目,則默認情況下會導出所有源文件夾。 – A4L

+0

我已經出口了整個項目。當我們將java項目導出爲runnable jar時,我猜測它會導出整個java項目。所以我應該如何在jar包中包含資源文件夾? –

0

的FileInputStream文件=(的FileInputStream) this.getClass資源

InputStream is = getClass().getResourceAsStream("my/pack/age/Excel.xlsx"); 

的絕對名稱( ).getResourceAsStream( 「/資源/ Excel.xlsx」);

爲什麼你需要FileInputStream?使用

InputStream is = getClass().getResourceAsStream.. 

其次利用 「資源/ Excel.xlsx」 第三構建文件中像這樣

新 文件時(System.getProperty( 「user.dir來」)+文件分割符+「資源「+文件分割符+」 Excel.xlsx「));

很難控制斜槓。使用

new File("parent (userdir property)", "child (resources\Excel.xlsx)") 
+0

嗨@cdkrot POI庫的XSSFWorkBook的構造函數要求FileInputStream的一個實例,所以我應該如何去做。你也可以指導我解決方案,我可以從jar和jar外面運行同一段代碼,即在eclipse中的java項目? –