【前面的话】

前段时间在学习和玩java web相关的东西,对于这些技术,一边学习,一边做东西,一边总结,希望可以一边成长和有所收获。有时总是思考太多反而成为了前进的阻力,所以对于生活还是简单一些,不以最坏的恶意去揣摩别人,但是对于技术还是要认真对待,一点都马虎不得。

前段时间做了一下开发,最近马上也要过年了,时间相对就比较多了,所以又回过头来看看书,巩固一下基础知识,做一些笔记,看看自己的思维,主要目的是为了自己积累,所以都是很基础、很基础的知识,请自行选择。如果看到这里要走了,祝新年快乐,也不枉进来一趟。

【问题背景】

在做完项目的第一期以后,发现由于项目中的一些变量需要经常修改,而修改.java文件就需要对于整个项目进行重新编译,而这个项目里面有很多图片,每次用eclipse进行编译都非常慢,所以就想到把所有需要经常改变的变量全部定义到.properties文件中,每次改变变量的值得时候,只需要去改变.properties文件中的变量值就可以,从而不需要重新编译代码,就可以直接运行,这样就比较方便了。

【术语定义】

  • .properties文件注释:注释以#开始;
  • .properties文件格式:文件格式为文本文件,可以使用记事本打开;
  • .propertise文件内容:文件内容的格式是:“键=值”;
  • JDK对于操作的支持:JDK 内置java.util.Properties 类可以使得我们操作.properties 文件;
  • .properties示例:
 #定义了max和min
max=1000
min=2

【代码描述】

  • 项目中的代码不方便贴出,刚好在网上看到了一份代码,稍加改造,写出了一个demo,供读者参阅。
  • 代码参考了【参考资料】中的部分代码(如涉及版权,请及时联系,好方便删除)。
  • 代码写了三个文件如下:
  1. PropertiesText.java
  2. ActionText.java
  3. Maintext.java
  • 另外还有.properties文件:
  1. text.properties
  2. ps:应该还有一个.properties文件,名字为:save.properties文件。这个文件在最开始是不需要自己动手建立,可以生成。
  • 代码:
  1. PropertiesText.java
 package configuration;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties; /**
* 读取properties文件
* @author Qutr
*
*/
public class PropertiesText
{
private Properties propertie;
private FileInputStream inputFile;
private FileOutputStream outputFile;
/**
* 初始化ProtertiesText类
*/
public PropertiesText()
{
propertie = new Properties();
}
/**
* 初始化Configuration类
* @param filePath 要读取的配置文件的路径+名称
*/
public PropertiesText(String filePath)
{
propertie = new Properties();
try{
inputFile = new FileInputStream(filePath);
propertie.load(inputFile);
inputFile.close();
} catch (FileNotFoundException ex){
System.out.println("读取属性文件--->失败!- 原因:文件路径错误或者文件不存在");
ex.printStackTrace();
} catch (IOException ex) {
System.out.println("装载文件--->失败!");
ex.printStackTrace();
}
}//end ReadConfigInfo(...)
/**
* 重载函数,得到key的值
* @param key 取得其值的键
* @return key的值
*/
public String getValue(String key)
{
if(propertie.containsKey(key)){
String value = propertie.getProperty(key);//得到某一属性的值
return value;
}
else
return "";
}//end getValue(...)
/**
* 重载函数,得到key的值
* @param fileName properties文件的路径+文件名
* @param key 取得其值的键
* @return key的值
*/
public String getValue(String fileName, String key)
{
try{
String value = "";
inputFile = new FileInputStream(fileName);
propertie.load(inputFile);
inputFile.close();
if(propertie.containsKey(key)){
value = propertie.getProperty(key);
return value;
}else
return value;
} catch (FileNotFoundException e) {
e.printStackTrace();
return "";
} catch (IOException e) {
e.printStackTrace();
return "";
} catch (Exception ex){
ex.printStackTrace();
return "";
}
}//end getValue(...)
/**
* 清除properties文件中所有的key和其值
*/
public void clear()
{
propertie.clear();
}//end clear();
/**
* 改变或添加一个key的值,当key存在于properties文件中时该key的值被value所代替,
* 当key不存在时,该key的值是value
* @param key 要存入的键
* @param value 要存入的值
*/
public void setValue(String key, String value)
{
propertie.setProperty(key, value);
}//end setValue(...)
/**
* 将更改后的文件数据存入指定的文件中,该文件可以事先不存在。
* @param fileName 文件路径+文件名称
* @param description 对该文件的描述
*/
public void saveFile(String fileName, String description)
{
try{
outputFile = new FileOutputStream(fileName);
propertie.store(outputFile, description);
outputFile.close();
} catch (FileNotFoundException e){
e.printStackTrace();
} catch (IOException ioe){
ioe.printStackTrace();
}
}//end saveFile(...)
}//end class ProtertiesText

2.Maintext.java

 package configuration;
public class Maintext {
public static void main(String[] args){
ActionText actiontext=new ActionText();
actiontext.action();
}//end main()
}

3.text.properties

 aaaa=999999
b=10
max=10
d=0

4.ActionText.java版本1(有两个版本,说明不同的问题)

 package configuration;
public class ActionText {
public void action(){
String path=this.getClass().getResource("").getPath();
System.out.println(path);
PropertiesText rc = new PropertiesText(path+"../../text.properties");//相对路径
String b = rc.getValue("aaaa");//以下读取properties文件的值
System.out.println("aaaa = " + b);
PropertiesText cf = new PropertiesText();
String c = cf.getValue(path+"../../text.properties", "aaaa");
System.out.println("c = " + c);
cf.setValue("b", "99");
cf.setValue("max", "1000");
cf.saveFile(path+"../../save.properties","test");
}
}

4.ActionText.java版本2(有两个版本,说明不同的问题)

 package configuration;

 public class ActionText {
public void action(){
String path=ActionText.class.getClassLoader().getResource("").getPath();
System.out.println(path);
PropertiesText rc = new PropertiesText(path+"../text.properties");//相对路径
String b = rc.getValue("a");//以下读取properties文件的值
System.out.println("a = " + b);
PropertiesText cf = new PropertiesText();
String c = cf.getValue(path+"../text.properties", "a");
System.out.println("c = " + c);
cf.setValue("b", "99");
cf.setValue("max", "1000");
cf.saveFile(path+"../save.properties","test");
}
}

【运行结果】

1.版本1运行结果:

  • 打印到控制台的结果:
 /D:/workspace8/PropertiesText/bin/configuration/
aaaa = 999999
c = 999999
  • 存储到save中的数据:
 #test
#Sun Jan 26 09:47:10 CST 2014
max=1000
b=99
aaaa=999999
d=0

2.版本2运行结果:

  • 打印到控制台的结果:
 /D:/workspace8/PropertiesText/bin/
aaaa = 999999
c = 999999
  • 存储到save中的数据:
 #test
#Sun Jan 26 15:38:01 CST 2014
max=1000
b=99
aaaa=999999
d=0

【结果分析】

上面写两个版本的ActionText.java是为了区分下面两行代码:

String path=this.getClass().getResource("").getPath();(1)

String path=ActionText.class.getClassLoader().getResource("").getPath();(2)

1,  运行的结果可以看到这两者的区别

2,  代码(1)只能运行在非静态方法中

代码(2)可以运行在非静态方法和静态方法中。

【遇到问题】

其实上面的代码还是比较好操作,但是还是会有一些问题可能会遇到:

1,路径问题:在做的过程中,会遇到路径找不到,这里不具体分析相对路径和绝对路径的详细介绍,有时间单独写。

相对路径:就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径)。

绝对路径:相对与某个基准目录的路径。

2,错误:Invalid escape sequence (valid ones are  \b  \t  \n  \f  \r  \"  \'  \\ )

原因:这是一个正则表达式的错误,我理解的是,"\"在java中当作特殊字符处理的,所以这里就会把\t当作转义字符处理。

解决:所以提示有正则表达式的错误,改为\\就行。

3,当我在本地已经作好了以后,部署到服务器发现一直提醒找不到路径,打印出路径发现,把路径中的空格全变成了%20

解决办法:path=path.replaceAll("%20", " ");

ps:我没有找到更好的办法,使用了上面的办法。

4,静态方法中不能用this。

原因:this代表的是调用这个函数的对象的引用,而静态方法是属于类的,不属于对象,静态方法成功加载后,对象还不一定存在。

【参考资料】

Java Properties 类读取配置文件信息http://wenku.baidu.com/view/47dfcd2c2af90242a895e5d6.html

【后面的话】

自己以前就很喜欢写东西,但是比较少的写技术类的学习笔记,最近开始写,感觉很好,读到别人写的技术文章也很受教,有时看到别人写的条理性很清晰,并且很有见地的文章都很激动,希望自己可以写的越来越好,并且多一些自己的见解而不仅仅是对知识的照搬,可以多一些自己独到的东西在里面。

最近看到的一些话,分享一下:

  1. 人一辈子都在高潮低潮中浮沉,惟有庸碌的人,生活才如死水一般;或者要有极高的修养,方能廓然无累,真正的解脱。只要高潮不过分使你紧张,低潮不过分使你颓废,就好了。——《傅雷家书》
  2. 我相信你逐渐会学会这一套,越来越坚强的。我以前在信中和你提过感情的ruin[创伤,覆灭],就是要你把这些事当做心灵的灰烬看,看的时候当然不免感触万端,但不要刻骨铭心地伤害自己,而要像对着古战场一般的存着凭吊的心怀。——《傅雷家书》
  3. 寒塘渡鹤影,冷月葬花魂。——《红楼梦》
  4. 门前节选:
  • 草在结它的种子
  • 风在摇它的叶子
  • 我们站着,不说话——《门前》

——TT

Java学习笔记(二)——Java操作properties文件的更多相关文章

  1. Java学习笔记二:Java开发工具Eclipse的安装与使用

    Java开发工具Eclipse的安装与使用 正如office一样我们在开发java语言过程中同样需要依款不错的开发工具,目前市场上的IDE很多,这里只演示Eclipse的安装: 一:下载软件: 1.下 ...

  2. java学习笔记07--日期操作类

    java学习笔记07--日期操作类   一.Date类 在java.util包中定义了Date类,Date类本身使用非常简单,直接输出其实例化对象即可. public class T { public ...

  3. java学习笔记16--I/O流和文件

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note16.html,转载请注明源地址. IO(Input  Output)流 IO流用来处理 ...

  4. java学习笔记之IO编程—File文件操作类

    1. File类说明 在Java语言里面提供有对于文件操作系统操作的支持,而这个支持就在java.io.File类中进行了定义,也就是说在整个java.io包里面,File类是唯一一个与文件本身操作( ...

  5. Java 学习笔记(16)——Java数据库操作

    数据库操作是程序设计中十分重要的一个部分,Java内置JDBC来操作数据库 JDBC使用 JDBC--Java Database connecting Java数据库连接:本质上JDBC定义了操作数据 ...

  6. Java学习笔记二--API课堂记录

    JavaSE课堂记录(二) 第一节课 方法的重载:方法名相同,参数列表不同 方法的重写:方法名,参数列表相同 两同:方法名相同,参数列表相同 两小:访问权限小与等于父类,返回值类型小于等于父类(返回值 ...

  7. Java学习笔记十:Java的数组以及操作数组

    Java的数组以及操作数组 一:什么是数组: 数组可以理解为是一个巨大的“盒子”,里面可以按顺序存放多个类型相同的数据,比如可以定义 int 型的数组 scores 存储 4 名学生的成绩 数组中的元 ...

  8. java学习笔记——IO部分(遍历文件夹)

    用File类写的一个简单的工具,遍历文件夹,获取该文件夹下的所以文件(含子目录下的文件)和文件大小: /** * 列出指定目录下(包含其子目录)的所有文件 * @author syskey * */ ...

  9. Java 学习笔记 (二) Selenium WebDriver Java 弹出框

    下面这段实例实现了以下功能: 1. profile使用用户本地电脑上的 (selenium 3有问题.因为selenium 3把profile复制到一个temp文件夹里,但并不复制回去.所以每次打开仍 ...

  10. Java学习笔记二:数据类型II

    GitHub代码练习地址:https://github.com/Neo-ML/JavaPractice/blob/master/Intpractice3.java 一  Java中的数据类型 Java ...

随机推荐

  1. Connections between cities LCA

    Problem Description After World War X, a lot of cities have been seriously damaged, and we need to r ...

  2. c# MD5盐值加密

    using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptograph ...

  3. Windows常用shell命令大全(转)

    [Windows常用shell命令大全] 基于鼠标操作的后果就是OS界面外观发生改变, 就得多花学习成本.更主要的是基于界面引导Path与命令行直达速度是难以比拟的.另外Geek很大一部分是键盘控,而 ...

  4. oracle 存储过程 技巧

    我们在进行pl/sql编程时打交道最多的就是存储过程了.存储过程的结构是非常的简单的,我们在这里除了学习存储过程的基本结构外,还会学习编写存储过程时相关的一些实用的知识.如:游标的处理,异常的处理,集 ...

  5. 转:Java中的equals和hashCode方法详解

    转自:Java中的equals和hashCode方法详解 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要重写这 ...

  6. windows 安装elk日志系统

    1.前往https://www.elastic.co官网下载对应的elasticsearch .kibana和logstash他们的版本号一致. 2.elasticsearch 解压后前往bin文件下 ...

  7. redis的安装和常用命令

    一.redis的安装 1.windows安装redis 下载地址:https://github.com/MSOpenTech/redis/releases. Redis 支持 32 位和 64 位.这 ...

  8. 外观模式(Facde)【设计模式】

    定义:为子系统中的一组接口提供一个一致的界面,Fcade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. “外观模式(Facade pattern),是软件工程中常用的一种软件设计模式,它 ...

  9. 洛谷P2901 [USACO08MAR]牛慢跑Cow Jogging

    题目描述 Bessie has taken heed of the evils of sloth and has decided to get fit by jogging from the barn ...

  10. MyBatis 框架系列之基础初识

    MyBatis 框架系列之基础初识 1.什么是 MyBatis MyBatis 本是 apache 的一个开源项目 iBatis,后改名为 MyBatis,它 是一个优秀的持久层框架,对 jdbc 的 ...