classpath的jar包中讀取文件

  • 在idea中讀取resources下的文件沒有問題(調用getFile),但是打成jar包就會出問題;
  • 使用spring的ClassPathResource或者hutool的ClassPathResource去解析文件都會有問題;
  • 但是使用上面兩個工具去讀取inputstream或者byte就沒問題,因爲內部都是調用ClassLoader的getResource方法,如果是文件,那麼就是file://xxx,如果是jar包那麼就會是jar:file://xxx;
  • 因爲如果是讀取文件,那麼路徑就是file://xxx,但是在jar包中就不存在這東西,只會存在jar:file://xxx。讀取inputstream或者byte最終會被解析成url方式讀取(調用url的openStream方法),url方式讀取就可以讀取到file://xxx或者jar:file://xxx,讀取文件就不行
  • 所以遇到這種問題的時候不要試圖去讀取文件,而是要讀取inputstream或者bytes
  • 有3種方式可以實現:1. 手動去使用ClassLoader獲取,2. 使用spring的ClassPathResource,3. 使用hutool的ClassPathResource
  • 推薦:hutool的ClassPathResource,因爲代碼量少,並且不用捕獲異常,hutool封裝了ResourceUtil,使用getResourceObj或者readBytes方法都可以
  • 注意:文件名前不需要加classpath:,也不用加/這種絕對路徑:
    • 錯誤示範:Resource resource = ResourceUtil.getResourceObj("classpath:/config/a.xlsx");
    • 正確示範:Resource resource = ResourceUtil.getResourceObj("config/a.xlsx");
    發表評論
    所有評論
    還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
    相關文章