在java中如何读取properties文件

在java中如何读取properties文件,第1张

最常用读取properties文件方法

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文件进行读取、怎样让日期范围走索引等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9666823.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存