今天在Java程序中讀取resources資源下的文件,由於對Java結構了解不透徹,遇到很多坑。正常在Java工程中讀取某路徑下的文件時,可以采用絕對路徑和相對路徑,絕對路徑沒什么好說的,相對路徑,即相對於當前類的路徑。在本地工程和服務器中讀取文件的方式有所不同,以下圖配置文件為例:

(1)本地讀取資源文件
Java類中需要讀取properties中的配置文件,可以采用文件(File)方式進行讀取:
File file = new File("src/main/resources/properties/test.properties");
InputStream in = new FileInputStream(file);
注意:當在IDEA中運行(不部署在服務器上),可以讀取到該文件;
原因:JavaWeb項目部署服務器中,會將項目打包成Jar包或者war包,此時就不會存在 src/main/resources 目錄,JVM會在編譯項目時,主動將 java文件編譯成 class文件 和 resources 下的靜態文件放在 target/classes目錄下;
理解:Java文件只有編譯成 class文件才會被JVM執行,本地執行時會,當前項目即為Java進程的工作空間,雖然class文件在target/classes目錄下,但是target/classes不是class文件運行的目錄,只是存放的目錄,運行目錄還是在IDEA的模塊下,所以運行時會找到 src/main/resources 資源文件!
(2)服務器(Tomcat)讀取資源文件
當工程部署到Tomcat中時,按照上邊方式,則會拋出異常:FileNotFoundException。原因:Java工程打包部署到Tomcat中時,properties的路徑變到頂層(classes下),這是由Maven工程結構決定的。由Maven構建的web工程,主代碼放在src/main/java路徑下,資源放在src/main/resources路徑下,當構建jar包 或 war包時,JVM虛擬機會自動編譯java文件為class文件存放在 target/classes目錄下,resource資源下的文件會原封不動的拷貝一份到 target/classes 目錄下:

讀取文件示例:
public static void loadIPInfo(InputStream InputStream) throws IOException {
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(InputStream, "UTF-8"));
String line = null;
while ((line = br.readLine()) != null) {
locationInfos.add(getIPInfo(line));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
讀取資源文件和本地文件參考
