
InputStream in = getClass()getResourceAsStream("资源Name");这种方式要求properties文件和当前类在同一文件夹下面。如果在不同的包中,必须使用:
InputStream ins = thisgetClass()getResourceAsStream("/cn/zhao/properties/testPropertiesPath2properties");
Java中获取路径方法
获取路径的一个简单实现
反射方式获取properties文件的三种方式
1 反射方式获取properties文件最常用方法以及思考:
Java读取properties文件的方法比较多,网上最多的文章是"Java读取properties文件的六种方法",但在Java应用中,最常用还是通过javalangClass类的getResourceAsStream(String name) 方法来实现,但我见到众多读取properties文件的代码中,都会这么干:
InputStream in = getClass()getResourceAsStream("资源Name");
这里面有个问题,就是getClass()调用的时候默认省略了this!我们都知道,this是不能在static(静态)方法或者static块中使用的,原因是static类型的方法或者代码块是属于类本身的,不属于某个对象,而this本身就代表当前对象,而静态方法或者块调用的时候是不用初始化对象的。
问题是:假如我不想让某个类有对象,那么我会将此类的默认构造方法设为私有,当然也不会写别的共有的构造方法。并且我这个类是工具类,都是静态的方法和变量,我要在静态块或者静态方法中获取properties文件,这个方法就行不通了。
那怎么办呢?其实这个类就不是这么用的,他仅仅是需要获取一个Class对象就可以了,那还不容易啊--
取所有类的父类Object,用Objectclass难道不比你的用你正在写类自身方便安全吗 ?呵呵,下面给出一个例子,以方便交流。
import javautilProperties;
import javaioInputStream;
import javaioIOException;
/
读取Properties文件的例子
File: TestPropertiesjava
User: leizhimin
Date: 2008-2-15 18:38:40
/
public final class TestProperties {
private static String param1;
private static String param2;
static {
Properties prop = new Properties();
InputStream in = Object class getResourceAsStream( "/testproperties" );
try {
propload(in);
param1 = propgetProperty( "initYears1" )trim();
param2 = propgetProperty( "initYears2" )trim();
} catch (IOException e) {
eprintStackTrace();
}
}
/
私有构造方法,不需要创建对象
/
private TestProperties() {
}
public static String getParam1() {
return param1;
}
public static String getParam2() {
return param2;
}
public static void main(String args[]){
Systemoutprintln(getParam1());
Systemoutprintln(getParam2());
}
}
运行结果:
151
152
当然,把Objectclass换成intclass照样行,呵呵,大家可以试试。
另外,如果是static方法或块中读取Properties文件,还有一种最保险的方法,就是这个类的本身名字来直接获取Class对象,比如本例中可写成TestPropertiesclass,这样做是最保险的方法
2 获取路径的方式:
File fileB = new File( this getClass()getResource( "" )getPath());
System out println( "fileB path: " + fileB);
22获取当前类所在的工程名:
System out println("userdir path: " + System getProperty ("userdir"))<span style="background-color: white;">3 获取路径的一个简单的Java实现</span>
/
获取项目的相对路径下文件的绝对路径
@param parentDir
目标文件的父目录,例如说,工程的目录下,有lib与bin和conf目录,那么程序运行于lib or
bin,那么需要的配置文件却是conf里面,则需要找到该配置文件的绝对路径
@param fileName
文件名
@return一个绝对路径
/
public static String getPath(String parentDir, String fileName) {
String path = null;
String userdir = SystemgetProperty("userdir");
String userdirName = new File(userdir)getName();
if (userdirNameequalsIgnoreCase("lib")
|| userdirNameequalsIgnoreCase("bin")) {
File newf = new File(userdir);
File newp = new File(newfgetParent());
if (fileNametrim()equals("")) {
path = newpgetPath() + Fileseparator + parentDir;
} else {
path = newpgetPath() + Fileseparator + parentDir
+ Fileseparator + fileName;
}
} else {
if (fileNametrim()equals("")) {
path = userdir + Fileseparator + parentDir;
} else {
path = userdir + Fileseparator + parentDir + Fileseparator
+ fileName;
}
}
return path;
}
4 利用反射的方式获取路径:
InputStream ips1 = Enumeration class getClassLoader() getResourceAsStream( "cn/zhao/enumStudy/testPropertiesPath1properties" );
InputStream ips2 = Enumeration class getResourceAsStream( "testPropertiesPath1properties" );
InputStream ips3 = Enumeration class getResourceAsStream( "properties/testPropertiesPath2properties" );
SharedPreferences android的系统缓存文件,也是
properties文件的一种
获取SharedPreferences的两种方式:
1 调用Context对象的getSharedPreferences()方法
2 调用Activity对象的getPreferences()方法
两种方式的区别:
调用Context对象的getSharedPreferences()方法获得的SharedPreferences对象可以被同一应用程序下的其他组件共享
调用Activity对象的getPreferences()方法获得的SharedPreferences对象只能在该Activity中使用
SharedPreferences的四种 *** 作模式:
ContextMODE_PRIVATE
ContextMODE_APPEND
ContextMODE_WORLD_READABLE
ContextMODE_WORLD_WRITEABLE
ContextMODE_PRIVATE:为默认 *** 作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
ContextMODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件
ContextMODE_WORLD_READABLE和ContextMODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取
MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入
将数据保存至SharedPreferences:
SharedPreferences preferences=getSharedPreferences("user",ContextMODE_PRIVATE);
Editor editor=preferencesedit();
String name="xixi";
String age="22";
editorputString("name", name);
editorputString("age", age);
editorcommit();
从SharedPreferences获取数据:
SharedPreferences preferences=getSharedPreferences("user", ContextMODE_PRIVATE);
String name=preferencesgetString("name", "defaultname");
String age=preferencesgetString("age", "0");
Oracle中我们经常使用Date字段类型记录日期和时间,有的时候还在这个字段上建立索引。
然后通过Java程序访问数据库的时候,我们很自然的类似这样使用:select from table where endDate> and endDate<,然后通过PreparedStatement预编译,再通过setTimestamp传入由javautilDate转成javasqlTimestamp的参数(因为javasqlDate只有日期,javasqlTime只有时间,所以我们只能用javasqlTimestamp类型)。我们会认为这样应该走索引区间扫描,效率应该是非常高的。
而事实上,Oracle会把sql解释成如下这样来执行:select from table where TO_TIMESTAMP(endDate)> and TO_TIMESTAMP(endDate)<; 为什么?因为传入的参数是timestamp类型,Oracle从92版本以后支持这种类型,所以Oracle做了这样的转换,结果就是这个SQL执行变成了全表扫描。我们做的试验,加了一个index hint,强制走时间索引字段,结果效率也不高,sql执行变成了全索引扫描,和全表扫描没多大区别。结果效率还是低。
不光直接使用JDBC会是这样,Spring,iBatis在处理传入参数是javautilDate类型的时候,都会使用setTimestamp设定参数,所以都需要注意。
解决办法(四种解决办法,推荐方案一):
1sql修改成这样:select from table where endDate>to_date(,’yyyymmddhh24miss’) and endDate<to_date(,’yyyymmddhh24miss’);然后将传入参数格式化成对应格式的字符串在传入,这样由Oracle将字符串转成Date类型,就很顺利的走索引区间扫描,效率最高。
2在建立数据库连接的时候增加一个属性oraclejdbcV8Compatible=true,代码如下:
Properties prop=new Properties();
propsetProperty(“user”,””);
propsetProperty(“password”,””);
propsetProperty(“oraclejdbcV8Compatible”,”true”);
Connection connection = DriverManagergetConnection(“jdbc:oracle:thin:@127001:1521:test”, prop);
连接池也根据各自的配置方式增加这个属性即可。目前看来这个属性参数是处理时间映射关系的,但是还不确定它是否会带来其他的问题,所以要慎重使用。
3修改数据库列类型为timestamp类型。
4依据网上资料,Oracle 11g修改了驱动 api,使用方式可能也会有改变。因为无法试验,所以也不确定具体细节。
之前看过大神的 美团组件化方案 ,其中提到了通过servicelaoder进行解耦的思路,主要是通过配置接口及其实现类的方式坐到接口隔离作用,本文主要是实现此思路并延伸出通过加载自定义properties文件获取参数配置信息
通过查看ServiceLoader源码可知,ServiceLoader是通过加载META-INF/services/路径下的接口实现类,加载方式是通过读取配置文件并通过反射的方式获取类的实例
1配置文件读取,获取文件流
其中PREFIX = "META-INF/services/";
由此可见加载路径是META-INF文件夹下面的文件
2通过流获取实现类全路径
其中parseLine方法里面是做了类全路径名校验
思路:
1读取配置文件
2获取配置的类全名
3通过反射获取类的实例
我们的配置文件将写在assets文件夹下
通过查看apk包结构可以发现assets文件夹位置是与META-INF平级的,由此我们可以将系统的ServiceLoader加载文件路径改为assets路径
1配置文件读取,获取文件流
2通过流获取接口类与实现类的对应集合
由于接口类与实现类是一对一关系,所以通过Map以键值对的方式存储接口类与实现类,在系统ServiceLoader做简单修改:
3获取实现类
在上一步已经获取了所有接口类和实现类的集合,在此通过接口类全名来获取实现类全名,并通过反射的方式获取实现类实例:
到此我们自定义ServiceLoader已经初步实现,在实际开发中,我们一般只需要一个实例及单利,在此我们可以用Map将类的实例与接口类名绑定起来即可。
使用
加载properties配置参数的思路与ServiceLoader基本一致,只是获取配置参数可以通过java类Properties获取
1获取流
和自定义ServiceLoader获取流一致
2获取Properties实例
3获取value
4使用
1在查看Iterable 接口时无意中发现了default关键字,经查看资料显示为java8新加的,用于在接口中写默认的方法函数体
有兴趣的可以去 >
Log4j是Apache的一个开源项目,如果采用log4j输出日志,要对log4j加载配置文件的过程有所了解。log4j启动时,默认会寻找source folder下的log4jxml配置文件。
若没有会寻找log4jproperties文件加载配置。配置文件放置位置正确,不用在程序中手动加载log4j配置文件。如果将配置文件放到了config文件夹下,在build path中设置下即可。
通常一个java项目会有很多的配置文件,建议把所有的配置文件放到一个文件夹下,如果不手动设置,不用人为的写加载logproperties文件的代码时,直接放src目录下,千万要记得,如果新建一个java项目,src文件要弄成原文件包才行。
扩展资料:
使用log4j注意事项:
1、log4jproperties的配置文件需放在src(或者WEB/INFO/classes)目录下,启动tomcat进程时log4j引擎也会随之启动(也就是log4j会自动初始化)。
2、如果log4jproperties配置文件放在别的目录,则需要应用程序负责初始化log4j,如spring提供了一个初始化log4j的监听类,当然你也可以自已写个servlet初始化log4j。
3、log4jproperties里面的配置key=value时,value后面一定不能有空格,否则该项配置不能生效,因为log4j没有处理value后面的空格。
参考资料来源:百度百科-log4j
罗拉快跑是一款动作射击类游戏,中道具是游戏过程中玩家可以使用的一种特殊道具,它可以帮助玩家获得更多的分数或实现游戏的更多功能。
使用中道具的步骤为:
1)第一步,打开游戏界面,进入游戏,找到游戏中道具栏,选择要使用的中道具;
2)第二步,点击游戏界面上的“使用”按钮,确认使用中道具;
3)第三步,点击“确定”按钮,系统会立即激活中道具;
4)第四步,在游戏过程中,根据中道具不同的功能,使用相应的 *** 作来实现对应的效果,以达到最终的游戏目的。
在使用中道具的过程中,需要注意的是,每种中道具的使用时间和使用次数都是有限的,所以在使用中道具时应当慎重,以免影响游戏进度。
以上就是关于在java中如何读取properties文件全部的内容,包括:在java中如何读取properties文件、如何在Android开发中对properties文件进行读取、怎样让日期范围走索引等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)