2012-03-23 81 views
8

我有一個奇怪的問題:在SRC /主/資源的FileInputStream VS使用ClassPathResource VS的getResourceAsStream和文件完整性

我有一個 「template.xlsx」 文件。

如果我這樣做:

InputStream is = new ClassPathResource("template.xlsx").getInputStream(); 

或者這樣:

InputStream is = ClassLoader.getSystemResourceAsStream("template.xlsx"); 

或者這樣:

InputStream is = getClass().getResourceAsStream("/template.xlsx"); 

當我嘗試創建一個工作簿:

Workbook wb = new XSSFWorkbook(is); 

我得到這個錯誤:

java.util.zip.ZipException: invalid block type 

但是,當我把我的文件是這樣的:

InputStream is = new FileInputStream("C:/.../src/main/resources/template.xlsx"); 

它的工作原理!

出了什麼問題?我無法將完整路徑硬編碼到文件。

有人可以幫助我嗎?

感謝

+1

您可以確保在從類路徑加載時*完全*確定正在加載哪個版本的'template.xlsx'? 'getResourceAsStream()'(等等)可以從很多地方加載資源。通過文件名,您可以絕對確定正在加載的內容。 – 2012-03-23 14:18:54

回答

18

我有同樣的問題,你可能有一個Maven過濾的問題。

此代碼加載從源文件,未經過濾的

InputStream is = new FileInputStream("C:/.../src/main/resources/template.xlsx"); 

此代碼加載從目標目錄中的文件,Maven有過濾內容

InputStream is = getClass().getResourceAsStream("/template.xlsx"); 

後,您不應該過濾的二進制文件,如excel並使用兩個互斥的資源集,如本頁底部所述maven resources plugin

+0

這是由於maven過濾而不是用於加載流的方法!謝謝:) – 2012-08-20 12:32:55

+0

非常感謝你的回答,我已經花了這麼多小時在這個問題上(( – 2014-12-19 11:09:00

+0

我節省了幾個小時,謝謝 – 2015-05-06 12:26:31

0

沒有嘗試訪問它像

InputStream is = new FileInputStream("/main/resources/template.xlsx"); 

相關問題