Java获取jar包以外资源的方法

  介绍

小编给大家分享一下Java获取jar包以外资源的方法,希望大家阅读完这篇文章后大所收获、下面让我们一起去探讨吧!

在使用jar执行Java代码时,有一个需求是从jar包所在目录的同级目录下读取配置文件的需求,从网上找了很多方法感觉都挺复杂的,

<强>在这里总结一下。

以类路径开头的URL表示该文件为jar包内文件的路径。

如:类路径://config/app.config表示jar包根路径配置文件夹下的应用。配置文件

以文件开头的URL表示该文件为jar包外文件的路径

如:文件://,/config/应用程序。配置表示

<>强摘要

//当前我想从jar包的同级目录下读取一个名为& # 39;config.txt& # 39;的文件的话,我需要指定目录为。

文件文件=新文件(“!”,“config.txt")

<强>说明

文件文件=新文件(“config.txt")

当只包含文件名称时,java程序会默认尝试从jar包的根路径去读取文件,当尝试使用file.getCanonicalPath()方法读取时,便会得到该文件在jar包内的路径。

<强>示例

我当前的工程的路径为D: \ WorkSpace \ path_demo01 \

在工程执行以下java代码:

当指定父母时:

会从父母下查找路径资源。

日志(FileUtil.file (“!”,“/config/app.config") .getCanonicalPath ());
  日志(FileUtil.file(“管理者”、“配置/app.config") .getCanonicalPath ());//D: \ WorkSpace \ path_demo01 \ config \ app.config//加载与当前jar包同级目录下的文件
  日志(FileUtil.file (“!”,“app.config") .getCanonicalPath ()); 

<强>当没有指定父:

如果路径为绝对路径时,会从绝对路径下查找

如果路径为相对路径时,会从类路径的根路径下开始查找

日志(FileUtil.file (“/config/app.config") .getCanonicalPath ());//D: \ config \ app.config      日志(FileUtil.file(“配置/app.config") .getCanonicalPath ());//D: \ WorkSpace \ path_demo01 \ \ config \ app \类目标。配置

<>强通过当前类加载资源:

如果路径为相对路径会指定要加载的资源路径与当前类所在包的路径一致

如果路径为绝对路径,那么就会从类路径的根路径下开始查找

日志(App.class.getResource (“/config/app.config"));//文件:/D:/WorkSpace/path_demo01/目标/类/config/app.config      日志(App.class.getResource(“配置/app.config"));//文件:/D:/WorkSpace/path_demo01/目标/类/高级/ghimi/config/app.config

通过类加载器加载资源:

默认是根从类路径下获取,路径不能以/开头,最终是由类加载器获取资源。

日志(App.class.getClassLoader () .getResource (“/config/app.config"));//空
  
  日志(App.class.getClassLoader () .getResource(“配置/app.config"));//文件:/D:/WorkSpace/path_demo01/目标/类/config/应用程序。配置

<强>加载jar包内的资源

当代码打包成jar包的形式后,是无法通过新文件()的形式加载jar包内的资源的。此时有可能抛出

FileNotFoundException异常,是由于将路径当成jar包外的目录查找不到资源导致的。

URI不分层异常,是由于无法直接读取jar包中资源(透明)而抛出的异常。

<>强解决方法:

使用getResourceAsStream()方法直接获取资源的流而不是getResource()获取资源文件对象的方式读取资源。

//修改前,未打包成jar包时能够正常执行,打包后会抛出异常
  日志(App.class.getClassLoader () .getResource(“配置/app.config"));//修改后,打成jar包后也可以正常加载资源
  日志(App.class.getClassLoader () .getResourceAsStream(“配置/app.config")); 

<强>加载jar包外的资源

会从父母目录下查找路径资源。

//加载与当前jar包同级目录下的文件
  日志(FileUtil.file (“!”,“app.config") .getCanonicalPath ());//D: \ WorkSpace \ path_demo01 \ app.config//加载与当前jar包的上一级目录下的文件
  日志(FileUtil.file (“…“,“app.config") .getCanonicalPath ());//D: \ WorkSpace \ app。配置

<>强借用工具hutool:

& lt; dependency>   & lt; groupId> cn.hutool   & lt; artifactId> hutool-all   & lt; version> 4.5.6   & lt;/dependency>

<强> java中jar包内的类访问jar包内部的资源文件的路径问题

在本地项目中,若我们要访问项目中的资源文件,则一般使用相对路径或者用System.getProperities (“user.dir")得到项目根目录,然后再访问资源文件,但是在将该工程和资源文件打包为jar包,运行该jar文件时,会显示找不到资源文件的错误。

Java获取jar包以外资源的方法