读取classpath资源

读取classpath资源

廖雪峰

资深软件开发工程师,业余马拉松选手。

很多Java程序启动的时候,都需要读取配置文件。例如,从一个.properties文件中读取配置:

String conf = "C:\\conf\\default.properties";

try (InputStream input = new FileInputStream(conf)) {

// TODO:

}

这段代码要正常执行,必须在C盘创建conf目录,然后在目录里创建default.properties文件。但是,在Linux系统上,路径和Windows的又不一样。

因此,从磁盘的固定目录读取配置文件,不是一个好的办法。

有没有路径无关的读取文件的方式呢?

我们知道,Java存放.class的目录或jar包也可以包含任意其他类型的文件,例如:

配置文件,例如.properties;

图片文件,例如.jpg;

文本文件,例如.txt,.csv;

……

从classpath读取文件就可以避免不同环境下文件路径不一致的问题:如果我们把default.properties文件放到classpath中,就不用关心它的实际存放路径。

在classpath中的资源文件,路径总是以/开头,我们先获取当前的Class对象,然后调用getResourceAsStream()就可以直接从classpath读取任意的资源文件:

try (InputStream input = getClass().getResourceAsStream("/default.properties")) {

// TODO:

}

调用getResourceAsStream()需要特别注意的一点是,如果资源文件不存在,它将返回null。因此,我们需要检查返回的InputStream是否为null,如果为null,表示资源文件在classpath中没有找到:

try (InputStream input = getClass().getResourceAsStream("/default.properties")) {

if (input != null) {

// TODO:

}

}

如果我们把默认的配置放到jar包中,再从外部文件系统读取一个可选的配置文件,就可以做到既有默认的配置文件,又可以让用户自己修改配置:

Properties props = new Properties();

props.load(inputStreamFromClassPath("/default.properties"));

props.load(inputStreamFromFile("./conf.properties"));

这样读取配置文件,应用程序启动就更加灵活。

小结

把资源存储在classpath中可以避免文件路径依赖;

Class对象的getResourceAsStream()可以从classpath中读取指定资源;

根据classpath读取资源时,需要检查返回的InputStream是否为null。

关于作者: admin

相关推荐

Eclipse项目环境配置

Eclipse项目环境配置

beat365官方app最新版 08-03
天刀如何获得流通金(银两)

天刀如何获得流通金(银两)

365足球外围网站官网 06-28
邢台市临城县十大著名旅游景点榜中榜

邢台市临城县十大著名旅游景点榜中榜

365足球外围网站官网 07-06