Logo

郎哥编程

使用FileReader如何读取项目配置文件

2018-05-26 1062

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集合类。其实现过程如下图所示:

     

00110.png

                                       

图 16-13 读取配置文件流程图

 

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

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集合,输出配置文件的属性和值。程序输出结果如下图所示:

00111.png

图 16-14 用FileReader读取配置文件输出结果

 

■ 知识点拨

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


代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论