JAVA获取资源文件方法

时间:2021-04-20 18:43:14

1. 我的idea文件的结构:

JAVA获取资源文件方法

在其中有两个FileGetTest.java文件,一个在java文件夹下,一个在/java/pathtest文件夹下,在其中运行如下代码:

File directory = new File("");//设定为当前文件夹
System.out.println(directory.getCanonicalPath());//获取标准的路径
System.out.println(directory.getAbsolutePath());//获取绝对路径


//创建文件
File file = new File("eab.xml");
if (!file.exists()) {
file.createNewFile();
}

运行结果都一样:

/Users/simon/IdeaProjects/eurekatest
/Users/simon/IdeaProjects/eurekatest

创建的文件也在根目录下:

JAVA获取资源文件方法

2.在idea中用maven构建项目,默认的存放资源文件的文件夹是resources, maven会在构建时将文件夹中的文件拷贝到target/classes目录下:

JAVA获取资源文件方法

编译后ehcache.xml文件被自动拷贝到target/classes文件夹下,如下图:

JAVA获取资源文件方法

如需在程序中读取该配置文件, 文件内容:

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
updateCheck="false">


<!-- 默认缓存配置 ,缓存名称为 default -->
<defaultCache maxElementsInMemory="50" eternal="false"
overflowToDisk="false" memoryStoreEvictionPolicy="LFU" />

<!-- 自定义缓存,名称为lt.ehcache -->
<cache name="lt.ecache" maxElementsInMemory="50" eternal="false"
overflowToDisk="false" memoryStoreEvictionPolicy="LFU" />

</ehcache>

第一种方法:

import java.io.*;

public class EhCacheTest {
public static void main(String[] args) throws Exception{
InputStream input = EhCacheTest.class.getClassLoader().getResourceAsStream("ehcache.xml");
System.out.println(convertStreamToString(input));
}

public static String convertStreamToString(InputStream is) {
/*
* To convert the InputStream to String we use the BufferedReader.readLine()
* method. We iterate until the BufferedReader return null which means
* there's no more data to read. Each line will appended to a StringBuilder
* and returned as String.
*/

BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
}

运行结果,可以读出该文件,并打印在控制台上:

JAVA获取资源文件方法

第二种方法,只是更改第一行语句:

        InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream("ehcache.xml");

效果是一样的

第三种:

InputStream input = EhCacheTest.class.getResourceAsStream("ehcache.xml");

以上方法都可以取得配置文件的信息,当然也可以调用getResouce()方法,该方法返回一个文件的URL, 许多类都支持使用该参数来读入配置文件,如Ehcache中的CacheManager类中的create()方法:


import java.io.*;
import java.net.URL;
import java.util.List;

import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;

public class EhCacheTest {
public static void main(String[] args) throws Exception{
URL input = EhCacheTest.class.getResource("ehcache.xml");

CacheManager manager = CacheManager.create(input);

//创建Cache对象
Cache cache = manager.getCache("lt.ecache");

//cache缓存名称
System.out.println("cache name: " + cache.getName());

//将对象放入缓存
Element element = new Element("hello", "world");
Element element2 = new Element("aaa", "111");
Element element3 = new Element("bbb", "222");
Element element4 = new Element("bbb", "222");
cache.put(element);
cache.put(element2);
cache.put(element3);
cache.put(element4);//key相同时会被覆盖

//cache缓存对象个数
System.out.println("size: " + cache.getSize());

// 从cache中取回元素
System.out.println("hello: " + cache.get("hello").getValue());

List<String> keys = cache.getKeys();//所有缓存对象的key

// 遍历所有缓存对象
for(String key : keys ){
System.out.println(key + " : " + cache.get(key));
}
// 从Cache中移除一个元素
System.out.println(cache.remove("hello"));
System.out.println(cache.remove("hello2"));
//移除所有缓存对象
cache.removeAll();
System.out.println("size: " + cache.getSize());
manager.shutdown();
}
}

也可以在代码中配置:


import java.io.*;
import java.net.URL;
import java.util.List;

import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
import net.sf.ehcache.config.CacheConfiguration;
import net.sf.ehcache.config.Configuration;
import net.sf.ehcache.store.MemoryStoreEvictionPolicy;





public class EhCacheTest {
public static void main(String[] args) throws Exception{
CacheConfiguration cacheConfig = new CacheConfiguration("lt.ecache", 50)
.memoryStoreEvictionPolicy(MemoryStoreEvictionPolicy.LFU) // 设置调度算法
.overflowToDisk(true) // 设置是否缓存到硬盘
.eternal(false) // 设置是否过期
.timeToLiveSeconds(60) // 对象存活时间
.timeToIdleSeconds(30) // 调度设置最大不活动时间
.diskPersistent(false) // 是否在磁盘上持久化。指重启jvm后,数据是否有效。默认为false。
.diskExpiryThreadIntervalSeconds(0);// 设置对象检测线程运行时间间隔
Configuration config = new Configuration();
config.addCache(cacheConfig);
CacheManager manager = CacheManager.create(config);
// CacheManager manager = CacheManager.create(input);
//创建Cache对象
Cache cache = manager.getCache("lt.ecache");
//cache缓存名称
System.out.println("cache name: " + cache.getName());
//将对象放入缓存
Element element = new Element("hello", "world");
Element element2 = new Element("aaa", "111");
Element element3 = new Element("bbb", "222");
Element element4 = new Element("bbb", "222");
cache.put(element);
cache.put(element2);
cache.put(element3);
cache.put(element4);//key相同时会被覆盖
//cache缓存对象个数
System.out.println("size: " + cache.getSize());
// 从cache中取回元素
System.out.println("hello: " + cache.get("hello").getValue());
List<String> keys = cache.getKeys();//所有缓存对象的key
// 遍历所有缓存对象
for(String key : keys ){
System.out.println(key + " : " + cache.get(key));
}
// 从Cache中移除一个元素
System.out.println(cache.remove("hello"));
System.out.println(cache.remove("hello2"));
//移除所有缓存对象
cache.removeAll();
System.out.println("size: " + cache.getSize());
manager.shutdown();
}
}

参考的文章:

EHCache入门
ClassLoad详解