使用FileReader如何读取项目配置文件
4153字,阅读需时14分钟

Java程序创建配置文件的目的是便于程序的修改和维护,程序需要的全局数据都可以存储到配置文件中,程序运行后可以直接读取配置文件获取全局数据,当需要修改全局数据时,只需要修改配置文件就可以了,而无需修改代码。

在前面一节中,我们使用FileWriter创建了一个数据库配置文件,该配置文件主要用于存储数据库连接地址、数据库访问账号和密码。当程序需要连接数据库时,可以从配置文件中读取数据库的连接地址、访问账号和密码。这样做的好处是可以确保连接数据库所需要的数据是唯一的,如果数据改变了,仅需修改配置文件即可,所有涉及到连接数据库的代码都无需修改。

编程案例

本次编程任务的要求是读取前面一节创建的配置文件myproperty.txt,该配置文件结构如下:

jdbc.url=jdbc:mysql://192.168.50.25:3306
jdbc.username=root
jdbc.password=123456

在上面的文件结构中,jdbc.url、jdbc.username、jdbc.password为配置文件的属性名称,其等号右边的内容为属性的值。要求案例程序不仅要读出配置文件内容,还要识别出属性和属性值。

编程探讨

依据编程案例给出的任务要求,首先要读取配置文件内容,并识别出配置文件内容的属性和属性值。

读取配置文件内容,可以考虑使用FileReader类,FileReader类是字符输入类,它的构造方法同FileInputStream相同,也提供了四个常用的构造方法。分别说明如下:

场景1:应用File对象,实例化一个FileReader对象

FileReader (File file);

场景2:应用给出的文件路径,实例化一个FileReader对象

FileReader (String fileName);

本案例为读取配置文件,采用FileReader (String fileName)构造方法,直接传入配置文件路径。

FileReader对象实例化后,可以使用FileReader提供的读取方法,读取配置文件内容。FileReader类提供了两种读取方法,说明如下:

●  public int read() throws IOException

该方法用于读取单个字符,返回int类型,该int类型表示字符。

●  public int read(char [] c, int offset, int len) throws IOException

该方法用于从文件的offset位置开始,读取len个字符到数组c,返回读取的字符数。

FileReader并没有提供按行读取文本内容的方法,因此我们需要实现一个按行读取文本内容的函数,该函数从文件中循环读取单个字符,并赋值给String对象,当读取到换行符时,结束读取,返回String对象。

另外,程序还需要一个识别属性和值的函数,该函数识别传入的字符串对象,调用String类的Split方法,用’=’号做分割符,识别出配置文件的属性和值。识别出的属性和值存储到HashMap集合中,其属性为HashMap的key,值为HashMap的value。

编程实现

程序实现涉及到类有FileReader类、File类、String类和HashMap集合类。其实现过程如下图所示:

image.png     

                                  

图 1 读取配置文件流程图

 

上面所示的流程图中,按行读取和识别属性和值框分别为程序要实现的函数。

package com.sample.demo;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
 
public class FileReadDemo {
 
public static void main(String[] args) throws IOException {
    // TODO Auto-generated method stub
    FileReadDemo demo = new FileReadDemo();
    // 应用HashMap存储从配置文件读取的属性和值
    HashMap<String, String> map = new HashMap<String, String>();
    // 实例化FileReader对象
    FileReader read = new FileReader("d://myproperty.txt");
    String strLine = "";
    boolean bHave = true;
    do {
        // 按行读取
        strLine = demo.readLine(read);
        // 识别属性和值,并将属性和值存储到map
        demo.split(map, strLine);
        bHave = !strLine.equals("error");
    } while (bHave);
 
    // 遍历HashMap
    Set<String> set = map.keySet();
    for (Iterator<String> iterator = set.iterator(); iterator.hasNext();) {
        String key = iterator.next();
        String value = map.get(key);
        System.out.println(key + "=" + value);
    }
}
 
// 安行读取配置文件
public String readLine(FileReader reader) throws IOException {
    String strLine = "";
    int c;
    while ((c = reader.read()) != -1) {
        if (c == '\n' || c == '\r') {
            return strLine;
        } else {
            strLine += (char) c;
        }
    }
    if (c == -1) {
        strLine = "error";
    }
    return strLine;
}
 
// 识别属性和值
public void split(HashMap<String, String> map, String str) {
    String[] temp = str.split("=");
    if (temp.length >= 2) {
        map.put(temp[0], temp[1]);
    }
}
 
}

readLine函数按行读取配置文件的内容,函数循环读取文件中的单个字符,当字符为\r或\n时,程序判断遇到了行结束符,返回已读取的字符串。

split函数用于识别配置文件的属性和值,并将属性和值加入到map集合中,因为配置文件中的属性和值用等号分割,因此应用String类的split方法将字符串用等号分割为包含两个元素的字符串数组,数组的第一个元素为属性,第二个元素为值。

程序最后遍历map集合,输出配置文件的属性和值。程序输出结果如下图所示:

image.png

图 2 用FileReader读取配置文件输出结果

 

文章小结

FileReader主要是读取文本类文件,可以读取单个字符,也可以将多个字符读取到一个字符数组中。遗憾的是,FileReader没有提供按行读取的方法,如果需要按行读取,需要自己实现按行读取方法。

我要评论
全部评论
郎宏林
授课老师
授课老师简介
项目经理,系统分析和架构师,从事多年中文信息处理技术。熟悉项目管理、擅长项目需求分析和设计、精通Java、C#、Python等编程语言。
下载APP

手机、电脑同步学

用微信或手机浏览器扫描二维码,即可下载APP。

  • 备案号:鲁ICP备15001146号
  • @1997-2018 潍坊米粒花网络技术有限公司版权所有