根据上一篇升级来的: java中动态的读取src下面的配置文件,动态的读取同个包下面的配置文件
工程目录:
文件路径工具类:
package com.lan.FilePath;
public class FilePath
{
//当前的工程下的路径
public static String getProjectPath()
{
return System.getProperty("user.dir").toString()+"\\";
}
//编译之后src下的文件路径,根据工程路径拼接
public static String getSrcPathAfterRun1()
{
return System.getProperty("user.dir").toString()+"\\bin\\";
}
//根据反射获取编译之后包下面的文件路径
public static String getPackagePath()
{
String thisPackagePath=FilePath.class .getResource("").toString();
// System.out.println("路径:"+thisPackagePath);
int m=thisPackagePath.indexOf("/");//去掉前面的file:
thisPackagePath=thisPackagePath.substring(m+1);
// System.out.println("路径:"+thisPackagePath);
return thisPackagePath;//返回当前包返回的路径。
}
//根据反射获取编译之后的src下面的文件路径
public static String getSrcPathAfterRun2()
{
String path = FilePath.class.getClassLoader().getResource("").toString();
// System.out.println("编译后src路径:"+path);//file:/D:/dev/workspase2Spring/XMLreader/bin/
int m = path.indexOf("/");// file:/<----点位到file:后面的反斜杠
path = path.substring(m + 1);// 从反斜杠之后的一位开始截取字符串
// System.out.println("编译后src路径:"+path);
return path;
}
}
打印配置文件工具类:
package com.lan.FilePath;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.Properties;
import java.util.Set;
public class PrintProperties
{
public static void printProperties(String filePath)
{
Properties properties=new Properties();
//新建一个配置文件类型。这个类型是一个键值对列表,类似于Map ,
//Properties类实现了Map接口
//Properties相当于只能存放String类型的键值对的Map集合
try
{
InputStream inStream=new BufferedInputStream(
new FileInputStream(filePath));
properties.load(inStream);
Set<String> keys=properties.stringPropertyNames();
//取出所有的键,作为键的Set集合
for(Iterator<String> it=keys.iterator();it.hasNext();)
{
String key=it.next();//取出下一个键key
String value=properties.getProperty(key);
//通过键从a.properties(相当于键值对Set集合)中取出value
System.out.println("key=\t"+key+"\tvalue="+value);
}
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
测试类:
package com.lan.FilePath;
public class FilePathTest
{
public static void main(String[] args)
{
System.out.println(System.getProperty("user.dir"));
System.out.println("当前工程路径: "+FilePath.getProjectPath());
System.out.println("编译后的src路径: "+FilePath.getSrcPathAfterRun1());
System.out.println("编译后的src路径: "+FilePath.getSrcPathAfterRun2());
System.out.println("编译之后的同一个包下面的路径: "+FilePath.getPackagePath());
System.out.println("------读取工程路径下面的配置文件:");
String cPath=FilePath.getProjectPath()+"c.properties";
PrintProperties.printProperties(cPath);
System.out.println("-----读取src下面的配置文件方法1: ");
String bPath=FilePath.getSrcPathAfterRun1()+"b.properties";
PrintProperties.printProperties(bPath);
System.out.println("-----读取src下面的配置文件方法2:");
String bPath2=FilePath.getSrcPathAfterRun2()+"b.properties";
PrintProperties.printProperties(bPath2);
System.out.println("-----读取相同包下面的配置文件:");
String aPath=FilePath.getPackagePath()+"a.properties";
PrintProperties.printProperties(aPath);
}
}
c.properties:
lan=123
xiaoming=nan
xiaohong=nv
b.properties:
lan=123
blue=234
green=2345
red=456
a.properties:
bule=lan
lan=bule
green=yes
yes=green
运行结果:
D:\dev\workspase2Spring\MyUtil
当前工程路径: D:\dev\workspase2Spring\MyUtil\
编译后的src路径: D:\dev\workspase2Spring\MyUtil\bin\
编译后的src路径: D:/dev/workspase2Spring/MyUtil/bin/
编译之后的同一个包下面的路径: D:/dev/workspase2Spring/MyUtil/bin/com/lan/FilePath/
------读取工程路径下面的配置文件:
key= lan value=123
key= xiaoming value=nan
key= xiaohong value=nv
-----读取src下面的配置文件方法1:
key= blue value=234
key= lan value=123
key= green value=2345
key= red value=456
-----读取src下面的配置文件方法2:
key= blue value=234
key= lan value=123
key= green value=2345
key= red value=456
-----读取相同包下面的配置文件:
key= bule value=lan
key= lan value=bule
key= green value=yes
key= yes value=green
FilePath类中提供了两种方法来找到文件路径。
通过工程路径来自己拼接,这种方式要对编译之后的文件路径理解透。src目录下的文件编译之后会出现在bin目录中。
第一种是:通过工程路径来自己拼接,这种方式要对编译之后的文件路径理解透。src目录下的文件编译之后会出现在bin目录中。通过工程路径来自己拼接,这种方式要对编译之后的文件路径理解透。src目录下的文件编译之后会出现在bin目录中。我这种方法目前只能拼接到bin目录下面。还没想好怎么拼接到包路径下面。
第二种是:使用反射。这种方法比较灵活。可以找到bin路径,也能找到包路径。