Java項目讀取resources資源文件和Java讀取本地文件項目部署問題解決


       今天在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();
            }
        }

    }

  

讀取資源文件和本地文件參考

Java項目讀取resources資源文件路徑那點事

java后端開發與服務中的本地文件讀取問題


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM