java读写properties文件和xml文件,解决中文乱码问题


前言

在开发当中我们经常需要用到配置文件,我们可以在配置文件中很方便的设置需要进行修改和配置的参数值,有时候我们本地开发和生产环境中有些参数也不一样,比如数据库IP和账号密码等、要读取的文件夹路径、日志备份的时间和周期等等,有些人可能会说直接将这些值定义为final变量不久可以了吗?这样的缺点是我们将项目部署到生产环境中时还要重新调整Java代码,然后重新生成jar包或者war包,而定义到配置文件中可以直接打开jar进行修改,我们在配置文件中设置这些参数就很方便后续进行修改。
在java中常用的配置文件有properties、xml和txt,本文就来介绍一下这三种配置文件的读写方法。


一、properties文件

1.1properties格式介绍

properties文件是一个文本文件,以“键=值”的方式书写一个属性的配置信息。
在这里插入图片描述
从上面的类结构图可以看出,它继承了Hashtable并实现了Map接口
properties的属性配置键值前后的空格在解析时候会被忽略。
注 释:前面加上#号
在这里插入图片描述

1.2读取项目resource/templates下面properties并处理中文乱码问题

读取properties文件,需要注意的是如果读取出的值含有中文的话会出现乱码的问题,需要再进行处理。
在这里插入图片描述
该properties文件放在项目resource/templates下面
代码如下:

    //读取properties资源文件
    public static String getProperties() {
    
    
        Properties properties = new Properties();
        try {
    
    
            InputStream resourceAsStream = SysSetParaEditController.class.getClassLoader().getResourceAsStream("getGKCX.properties");
            properties.load(resourceAsStream);
            String head = properties.getProperty("head");
            String content = properties.getProperty("content");
            String body = properties.getProperty("body");
            String function = properties.getProperty("function");
            String arg = properties.getProperty("arg");
            String functionend = properties.getProperty("functionend");
            String bodyend = properties.getProperty("bodyend");
            String contentend = properties.getProperty("contentend");
            System.out.println(head + "-->" + head);
            System.out.println(content + "-->" + content);
            System.out.println(body + "-->" + body);
            System.out.println(function + "-->" + function);
            System.out.println(arg + "-->" + arg);
            System.out.println(functionend + "-->" + functionend);
            System.out.println(bodyend + "-->" + bodyend);
            System.out.println(contentend + "-->" + contentend);
            resourceAsStream.close(); //关闭流
        }
        catch (IOException e) {
    
    
            e.printStackTrace();
        }
        //处理中文乱码
        String imgFolder = properties.getProperty("imgFolder");
        try {
    
    
            imgFolder = new String(imgFolder.getBytes("ISO-8859-1"), "GBK"); // 处理中文乱码
        }
        catch (UnsupportedEncodingException e) {
    
    
            e.printStackTrace();
        }
        System.out.println(imgFolder);
        return imgFolder;
    }

1.3读取本地properties并处理中文乱码问题

如果properties文件在本地的话,可以这样进行读取:
代码如下:

    //读取properties资源文件
    public static String getProperties() {
    
    
         Properties pro = new Properties();
        int maxTotal = 0;
        int maxIdel = 0;
        String host = null;
        int port = 0;
        try {
    
    
            pro.load(new FileReader("D:\\sun\\getGKCX.properties"));
            String imgFolder = properties.getProperty("imgFolder");
            imgFolder = new String(imgFolder.getBytes("ISO-8859-1"), "GBK"); // 处理中文乱码
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
        System.out.println(imgFolder);
        return imgFolder;
    }

1.4修改properties文件

    public static void writePropertiesFile(String filename)
    {
    
    
        Properties properties = new Properties();
        try{
    
    
        	//方法一:使用FileWriter 
            properties.setProperty("imgFolder", "D:\\sun");
            //创建字节输出流/字符输出流,构造方法中绑定要输出的目的地
            FileWriter fw=new FileWriter("D://a.txt");
            //使用Properties集合中的方法store,把集合中的临时数据,持久写入到硬盘中
            properties.store(fw, "save data");
            //释放资源
            fw.close();
            
            //方法二:使用OutputStream 
            OutputStream outputStream = new FileOutputStream(filename);
            properties.setProperty("imgFolder", "D:\\sun\\img");
            properties.store(outputStream, "author: sun");
            outputStream.close();
        }
        catch (IOException e)
        {
    
    
            e.printStackTrace();
        }
    }

二、XML文件

2.1xml文件格式

ML 指可扩展标记语言(EXtensible Markup Language),是一种标记语言,很类似 HTML。
在XML中,你可以拓展发明自己的标签,XML没有预定义的标签,XML允许创作者定义或设计自己的标签和文档结构
基本结构:
XML文档的后缀名 .xml
XML的第一行必须定义文档声明
在项目中经常见到的xml文件那就是pom.xml,相信大家对这个一定都不陌生吧!
还有mybatis使用的mybatis.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--<environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1/table?useUnicode=true&amp;characterEncoding=utf-8&amp;allowMultiQueries=true&amp;useSSL=false&amp;severTimezone=GMT%2B8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>-->
    <mappers>
         <mapper resource="com/sun/server/mapper/xml/TScdLogMapper.xml"/>
         <mapper resource="com/sun/server/mapper/xml/TScdOperateMapper.xml"/>
         <mapper resource="com/sun/server/mapper/xml/TScdOperatePartsMapper.xml"/>
         <mapper resource="com/sun/server/mapper/xml/TSysParainfoMapper.xml"/>
    </mappers>
</configuration>

2.2读取xml文件

代码如下(示例):

public static void readPropertiesFileFromXML(String filename)
    {
    
    
        Properties properties = new Properties();
        try
        {
    
    
            InputStream inputStream = new FileInputStream(filename);
            properties.loadFromXML(inputStream);
            inputStream.close();
        }
        catch (IOException e)
        {
    
    
            e.printStackTrace();
        }
        String imgFolder = properties.getProperty("imgFolder");; //XML中的中文不用处理乱码,正常显示
    }

2.3写xml文件

代码如下(示例):

//写资源文件到XML文件,含中文  
    public static void writePropertiesFileToXML(String filename)
    {
    
    
        Properties properties = new Properties();
        try
        {
    
    
            OutputStream outputStream = new FileOutputStream(filename);
            properties.setProperty("imgFolder", "D:\\sun\\img");
            properties.storeToXML(outputStream, "author: sun");
            outputStream.close();
        }
        catch (IOException e)
        {
    
    
            e.printStackTrace();
        }
    }

猜你喜欢

转载自blog.csdn.net/sunzixiao/article/details/132076095