2014-05-22 68 views
4

一個文件,我相信「正確」的方法之一是應該做的,這是getResourceAsStream(),但它只是似乎並沒有削減它。JavaEE的 - 戰爭 - 部署::如何讀取資源目錄

我的情況:

我在Java的Web應用程序將被部署最終以幾個不同的Web服務器的可能性是GlassFish的Tomcat的,並WildFly。目前我正在與Netbeans一起使用mac,我可以訪問WildFlyGlassFish。該項目是mavenized

我需要做的是讀取和寫入兩個不同的Excel文件。一個用作「模板」,一個用作輸出文件。該應用程序以前運行獨立,我試圖將其包裝到一個JSF網站。

我需要爲我的一個方法獲得FileInputStream,並最終創建一個輸出文件,該文件將通過http返回給用戶。

從我所收集合適的方式做到這一點應該是:

XLSX文件

/src/main/resources/ANALYSIS_template.xlsx 

位置一旦編譯成WAR文件:: WildFly

/usr/local/opt/wildfly-as/libexec/standalone/deployments/fleetForecast-1.0-SNAPSHOT.war/WEB-INF/classes/ANALYSIS_template.xlsx 

曾編譯成WAR文件的位置:: GlassFish

~/devel/fleetforecast/target/fleetForecast-1.0-SNAPSHOT/WEB-INF/classes/ANALYSIS_template.xlsx 

Java代碼的

我想我也許設法得到一個輸入流與命令文件:

InputStream is1 = getClass().getResourceAsStream("ANALYSIS_template.xlsx"); 

我也被嘗試("/ANALYSIS_template.xlsx")行爲相似的方式。當我嘗試從此輸入流中讀取時

try { 
     is1.read(); 
    } catch (IOException ex) { 
     Logger.getLogger(FleetBean.class.getName()).log(Level.SEVERE, null, ex); 
    } 

我收到java.lang.NullPointerException

Caused by: java.lang.NullPointerException 
    at org.mitre.fleetforecast.bean.FleetBean.<init>(FleetBean.java:57) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:408) 
    at java.lang.Class.newInstance(Class.java:433) 
    at com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:186) 
    ... 76 more 

提供或想到的任何援助將不勝感激。

+0

你肯定不希望使用絕對路徑或含有像'在/ usr/local'或'的src/main東西路徑'...查看[this](http://www.jugsardegna.org/vqwiki/jsp/Wiki?LoadResourcesOnJ2EEWebApplications)。 – jahroy

+0

我的java代碼沒有使用絕對路徑 - >我只是指出它們在文件系統上的位置 – poosliver

回答

6

最後,它看起來像這是做了伎倆的代碼。我不知道爲什麼,但顯然它工作,我不抱怨。

InputStream inputStream = getClass().getClassLoader() 
         .getResourceAsStream("/ANALYSIS_template.xlsx"); 
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); 

我做了一個新的項目表格從頭開始,此代碼工作。謝謝你們的幫助!

1

什麼是這樣的:

InputStream is1 = URLClassLoader.getSystemResourceAsStream("/classes/ANALYSIS_template.xlsx"); 

InputStream is1 = this.getClass().getResourceAsStream("/classes/ANALYSIS_template.xlsx")); 

編輯:

使用此當你從一個servlet容器訪問文件

InputStream is1 = ServletContext.getResourceAsStream("/WEB-INF/classes/ANALYSIS_template.xlsx") ; 
+0

對不起,這些似乎沒有工作 – Jeef

+0

編輯答案。 –

+0

謝謝,但我仍然堅持。也許在午餐後神聖的靈感。你所建議的一切都是互聯網所說的正確的選擇。我想知道是否有其他粗略的事情發生... – Jeef

0

這可能是文件的相對路徑與文件的絕對路徑有關的問題嗎? 您可以嘗試使用FileInputStream並使用絕對路徑嗎?如果那樣做有效,那麼你可能只需要修改相對路徑?

+0

這是一個好主意。我明天早上會試一試。 – Jeef

1

如果你想獲得Java文件對象,你可以試試這個:

String path = Thread.currentThread().getContextClassLoader().getResource("language/file.xml").getPath(); 
File f = new File(path); 
System.out.println(f.getAbsolutePath());