Java读取classpath下的文件
写Java程序时会经常从classpath下读取文件,是时候该整理一下了,并在不断深入的过程中,陆续补充上。
现在Java project 都以maven项目居多, 比如像下面这样的一个项目结构:
编译后的class文件都到了target目录,如下面的结构:
看代码:
import java.io.File;
import java.net.URL; public class Poem {
public static void main(String[] args) { Poem poem = new Poem();
poem.getFile("extObj.txt");
} private void getFile(String fileName) {
ClassLoader classLoader = getClass().getClassLoader();
/**
getResource()方法会去classpath下找这个文件,获取到url resource, 得到这个资源后,调用url.getFile获取到 文件 的绝对路径
*/
URL url = classLoader.getResource(fileName);
/**
* url.getFile() 得到这个文件的绝对路径
*/
System.out.println(url.getFile());
File file = new File(url.getFile());
System.out.println(file.exists());
}
}
通过上面这种方式就可以获取到这个文件资源。
在一个static method 里可以直接通过类的ClassLoader对象获取文件资源。
URL url = Poem.class.getClassLoader().getResource("extObj.txt");
File file = new File(url.getFile());
// 直接获取到输入流
// fileName 就是resources里的文件名
InputStream in = Poem.class.getClassLoader().getResourceAsStream(fileName);
综上述,类里的getClassLoader去寻找fileName都是从classpath去找的,毕竟是ClassLoader嘛。
如果一个包里面有一个配置文件,那该怎么获取呢? 如图:
第一个dbconfig.properties在类package下,第二个dbconfig.properties在resources目录下,
那怎么获取到package下的dbconfig properties文件呢?
here goes code:
package com.getfilefromclasspath; import java.io.IOException;
import java.io.InputStream;
import java.util.Properties; public class ClassLoaderDemo {
public static void main(String[] args) throws IOException {
ClassLoaderDemo demo = new ClassLoaderDemo();
demo.loadProperties(); } public void loadProperties() throws IOException {
InputStream input = null;
try
{
/**
/dbconfig.properties 绝对路径, 取到的文件是classpath下的
resources/dbconfig.properties 相对路径 获取文件流
*/
// 获取到classpath下的文件
input = Class.forName(ClassLoaderDemo.class.getName()).getResourceAsStream("/dbconfig.properties");
// 获取到package下的文件
// input = Class.forName(ClassLoaderDemo.class.getName()).getResourceAsStream("resources/dbconfig.properties");
} catch (ClassNotFoundException e)
{
e.printStackTrace();
}
printProperties(input);
} private void printProperties(InputStream input) throws IOException
{
Properties properties = new Properties();
properties.load(input);
System.out.println(properties.getProperty("username"));
}
}
不使用Class.forName(), 通过具体对象获取到Class对象:
//also can be this way:
input = this.getClass().getResourceAsStream("resources/dbconfig.properties"); // 对应package下的文件
input = this.getClass().getResourceAsStream("/dbconfig.properties"); // 对应resources下的文件
Class对象还有getResource() 的方法去获取文件资源,使用规则和上面的一样。
maven项目还要注意一点,maven 的compiler插件在编译时是不会将package下的文本文件给编译到target下的,
下图是我在用mybatis框架的时候将xml的mapper给放到package编译后的效果:
这个得在pom.xml加对应的配置(这是在使用mybatis时遇到的坑):
<build>
<finalName>java-io</finalName>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<!--properties的配置文件会和编译后的class文件放在一起-->
<include>**/*.properties</include>
</includes>
</resource>
<resource>
<!--加载配置的资源-->
<directory>src/main/resources</directory>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
Java读取classpath下的文件的更多相关文章
- java读取classpath下properties文件注意事项
1.properties文件在classpath根路径下读取方式 Properties properties = new Properties(); properties.load(BlogIndex ...
- 读取ClassPath下resource文件的正确姿势
1.前言 为什么要写这篇文章?身为Java程序员你有没有过每次需要读取 ClassPath 下的资源文件的时候,都要去百度一下,然后看到下面的这种答案: Thread.currentThread(). ...
- 【转】SpringBoot——web项目下读取classpath下的文件心得
在读取springBoot+gradle构建的项目时,如果使用传统的FileInputStream读取文件流或者ResourceUtils工具类的方式,都会失败,下面解释原因: 一.读取文件的三种方式 ...
- 解决:java 读取 resources 下面的 json 文件
前言:java 读取 工程下的配置文件,文件类型为 json(*.json),记录一下始终读取不到 json 文件的坑.maven项目 直接上工具类代码 package com.yule.compon ...
- java 获取classpath下文件多种方式
java 获取classpath下文件多种方式 一:properties下配置 在resources下定义server.properties register.jks.path=classpath\: ...
- SpringBoot项目构建成jar运行后,如何正确读取resource下的文件
SpringBoot项目构建成jar运行后,如何正确读取resource下的文件 不管你使用的是SpringBoot 1.x还是SpringBoot2.x,在开Dev环境中使用eclipse.IEAD ...
- Java读取Level-1行情dbf文件极致优化(3)
最近架构一个项目,实现行情的接入和分发,需要达到极致的低时延特性,这对于证券系统是非常重要的.接入的行情源是可以配置,既可以是Level-1,也可以是Level-2或其他第三方的源.虽然Level-1 ...
- Java读取Level-1行情dbf文件极致优化(2)
最近架构一个项目,实现行情的接入和分发,需要达到极致的低时延特性,这对于证券系统是非常重要的.接入的行情源是可以配置,既可以是Level-1,也可以是Level-2或其他第三方的源.虽然Level-1 ...
- Java遍历目录下全部文件并替换指定字符串
应用场景:比方有一个深层次的文件目录结构,如:javaAPI 每一个文件中面都有同样的内容,而我们要统一改动为其它内容.上千个文件假设一个个改动显得太不明智. import java.io.Buffe ...
随机推荐
- xshell SSH 连接出现 outgoing encryption ,或者no matching host key algorithm found错误的解决
首先看看xshell的使用版本,如果是xshell 4,提示的信息为:no matching host key algorithm found 如果是xshell 5,提示的是: outgoing e ...
- 【程序员技术练级】学习一门脚本语言 python(二)遍历本地文件系统
这篇将讲述怎么使用python来遍历本地文件系统,并把文件按文件大小从小到大排序的一个小例子 在这个例子中,主要会用到python内置的和OS模块的几个函数: os.walk() : 该方法用来遍历指 ...
- SecureCRT 连接 CentOS虚拟机
SecureCRT 连接 CentOS虚拟机 1.安装SecureCRT SecureCRT是一款支持SSH等协议的终端仿真软件,可以在windows下登录Linux服务器,这样大大方便了开发工作.安 ...
- Node.js 框架对比之 Express VS Koa
背景 上图是一个典型的采用 Node.js 开发 web 应用的前后端结构,下面介绍一下 Node 服务层在其中的作用以及使用 Node.js 的一些优劣. Node 服务层作用: 请求代理 传统做法 ...
- Git使用教程,感觉比较全,所以【转载】
一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以 ...
- C# 安装WindowService服务和相关
https://www.cnblogs.com/charlie-chen2016/p/8031774.html 这是一个备份数据库的服务,逻辑很简单,就是通过定时器实现在特定的时间执行SQL语句备份数 ...
- 5、Angular2 Injectable 服务
1.Injectable
- OLEDB 静态绑定和数据转化接口
OLEDB 提供了静态绑定和动态绑定两种方式,相比动态绑定来说,静态绑定在使用上更加简单,而在灵活性上不如动态绑定,动态绑定在前面已经介绍过了,本文主要介绍OLEDB中的静态,以及常用的数据类型转化接 ...
- Git回退到指定节点的版本
1.获取某个历史版本的id(即change-id,每个版本唯一) 方法1:使用git log命令查看所有的历史版本,输入q便可退出. git log 方法2:使用gitk图形化界面查看节点信息.(在安 ...
- SharePoint 2013 - REST Service
0. SharePoint 2013使用_api来标识出 REST SERVICE,REST Service其实是 client.svc web service的一部分,但为了简化 REST URI的 ...