Java读写.properties文件解决中文乱码问题

 更新时间:2017年11月21日 10:43:38   作者:李学凯  
这篇文章主要介绍了Java读写.properties文件解决中文乱码问题,非常具有实用价值,需要的朋友可以参考下

一般使用到properties配置文件,一般都是在spring项目里面,直接由框架帮你读,当然,你也得考虑到编码的问题。

但是现在要是要求使用Java直接读写properties文件,就发现很多的问题,比如,我的properties文件的编码竟然不是utf-8的。或者说我压根就没考虑到这个问题。

再比如,当properties文件里面有汉子的时候,发现读写的汉字乱码了,在我这是因为我的电脑默认编码是gbk,但是读的时候,又没有设置编码,搞出的问题。

下面直接上代码,看问题。

package com.lxk.propertyFileTest; 
 
import java.io.*; 
import java.util.Properties; 
 
/** 
 * 读写properties文件测试 
 * <p> 
 * Created by lxk on 2017/4/25 
 */ 
public class Main { 
  public static void main(String[] args) { 
    Properties prop = new Properties(); 
    InputStream in = null; 
    FileOutputStream oFile = null; 
    try { 
      in = new BufferedInputStream(new FileInputStream("D:config.properties")); 
      //prop.load(in);//直接这么写,如果properties文件中有汉子,则汉字会乱码。因为未设置编码格式。 
      prop.load(new InputStreamReader(in, "utf-8")); 
      for (String key : prop.stringPropertyNames()) { 
        System.out.println(key + ":" + prop.getProperty(key)); 
      } 
      //保存属性到b.properties文件 
      oFile = new FileOutputStream("b.properties", false);//true表示追加打开,false每次都是清空再重写 
 
      prop.setProperty("phone", "10086"); 
      //prop.store(oFile, "此参数是保存生成properties文件中第一行的注释说明文字");//这个会两个地方乱码 
      //prop.store(new OutputStreamWriter(oFile, "utf-8"), "汉字乱码");//这个就是生成的properties文件中第一行的注释文字乱码 
      prop.store(new OutputStreamWriter(oFile, "utf-8"), "lll"); 
    } catch (Exception e) { 
      System.out.println(e.getMessage()); 
    } finally { 
      if (in != null) { 
        try { 
          in.close(); 
        } catch (IOException e) { 
          System.out.println(e.getMessage()); 
        } 
      } 
      if (oFile != null) { 
        try { 
          oFile.close(); 
        } catch (IOException e) { 
          System.out.println(e.getMessage()); 
        } 
      } 
    } 
  } 
} 

运行结果:这个只是读出来的内容的结果。

下面是写出来的文件内容。

额,这个图,有点乱。但是,却把三种运行情况,全部给展示出来了。很清晰。

最后,代码里面也看到了怎么把字节流变成带编码格式的字符流,这个可以注意下,我也留个笔记。

对上面的代码的更新,算是结构调整,功能分开。瞬间代码看着就清晰明了啦。

所以,一般上面的代码是不推荐实用的。个中妙用,自行体会吧。

package com.lxk.propertyFileTest; 
 
import java.io.*; 
import java.util.Properties; 
 
/** 
 * 读写properties文件测试 
 * <p> 
 * Created by lxk on 2017/4/25 
 */ 
public class Main { 
  public static void main(String[] args) { 
    Properties prop = readPropertiesFile(); 
    writePropertiesFile(prop); 
  } 
 
  /** 
   * 读Properties文件 
   */ 
  private static Properties readPropertiesFile() { 
    Properties prop = new Properties(); 
    InputStream in = null; 
    try { 
      in = new BufferedInputStream(new FileInputStream("D:config.properties")); 
      //prop.load(in);//直接这么写,如果properties文件中有汉子,则汉字会乱码。因为未设置编码格式。 
      prop.load(new InputStreamReader(in, "utf-8")); 
      for (String key : prop.stringPropertyNames()) { 
        System.out.println(key + ":" + prop.getProperty(key)); 
      } 
    } catch (Exception e) { 
      System.out.println(e.getMessage()); 
    } finally { 
      if (in != null) { 
        try { 
          in.close(); 
        } catch (IOException e) { 
          System.out.println(e.getMessage()); 
        } 
      } 
    } 
    return prop; 
  } 
 
  /** 
   * 写Properties文件 
   */ 
  private static void writePropertiesFile(Properties prop) { 
    prop.setProperty("phone", "10086"); 
    FileOutputStream oFile = null; 
    try { 
      //保存属性到b.properties文件 
      oFile = new FileOutputStream("b.properties", false);//true表示追加打开,false每次都是清空再重写 
      //prop.store(oFile, "此参数是保存生成properties文件中第一行的注释说明文字");//这个会两个地方乱码 
      //prop.store(new OutputStreamWriter(oFile, "utf-8"), "汉字乱码");//这个就是生成的properties文件中第一行的注释文字乱码 
      prop.store(new OutputStreamWriter(oFile, "utf-8"), "lll"); 
    } catch (Exception e) { 
      System.out.println(e.getMessage()); 
    } finally { 
      if (oFile != null) { 
        try { 
          oFile.close(); 
        } catch (IOException e) { 
          System.out.println(e.getMessage()); 
        } 
      } 
    } 
  } 
 
} 

注意:这个是我后来发现的,不知道在看的各位有没有这个问题。

我发现写出来的properties文件的编码格式并不是简单的utf-8,而是utf-8无bom格式。证据可参见下图:

这个打开工具叫 Notepad++ 估计在看的各位的电脑上都有这个吧。

但是你要是把这个文件的编码格式给修改成utf-8编码之后,运行的结果,就有一丢丢不一样。

继续参见下图:

看到多了一个小杠“”-“”,具体怎么解释,我暂时还不清楚。

这个时候,写出来的文件的,也同样出现了这个问题,具体还是继续参见下图:

所以,这个我暂时解释不了。
惭愧。。。。
还有个问题就是:读出来的属性,是不按原来文件中的顺序展示的,当然写的时候,也是乱序的。
这还是个问题,还有待解决。什么时候解决了,再在此处留个链接。

链接:Java代码实现对properties文件有序的读写

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 一文详解Java中的Stream的汇总和分组操作

    一文详解Java中的Stream的汇总和分组操作

    这篇文章主要为大家详细介绍了Java8中的Stream的汇总和分组的操作,文中的示例代码讲解详细,对我们学习Java有一定帮助,需要的可以参考一下
    2022-09-09
  • mybatis项目CRUD步骤实例详解

    mybatis项目CRUD步骤实例详解

    这篇文章主要介绍了mybatis项目CRUD步骤,包括pom.xml引入相应的依赖,在resources目录下写配置文件,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • SpringBoot开发之拦截器实例

    SpringBoot开发之拦截器实例

    这篇文章主要介绍了SpringBoot开发之拦截器实例,Spring Boot简介Spring Boot发展史SpringBoot的魅力SpringBoot的优点总结Spring Boot是一个基于Spring框架的快速开发脚手架,它简化了Spring应用的初始化和搭建过程,需要的朋友可以参考下
    2023-09-09
  • java实现根据ip地址获取地理位置的代码分享

    java实现根据ip地址获取地理位置的代码分享

    这篇文章主要介绍了java实现根据ip地址获取地理位置的代码分享,本文中使用的是QQ在线接口,也可以使用新浪、淘宝等提供的在线接口,需要的朋友可以参考下
    2014-08-08
  • Java实现PDF转为Word文档的示例代码

    Java实现PDF转为Word文档的示例代码

    众所周知,PDF文档除了具有较强稳定性和兼容性外, 还具有较强的安全性,在工作中可以有效避免别人无意中对文档内容进行修改。本文将分为以下两部分介绍如何在保持布局的情况下将PDF转为Word文档,希望对大家有所帮助
    2023-01-01
  • Spring Integration Redis 使用示例详解

    Spring Integration Redis 使用示例详解

    本文给大家介绍Spring Integration Redis的配置与使用,涵盖依赖添加、Redis连接设置、分布式锁实现、消息通道配置及最佳实践,包括版本兼容性、连接池优化、序列化和常见问题解决方案,指导高效集成与应用,感兴趣的朋友跟随小编一起看看吧
    2025-08-08
  • java实现时间控制的几种方案

    java实现时间控制的几种方案

    这篇文章主要介绍了java实现时间控制的几种方案,本文从多个方面给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • Mybatis-plus配置之日期时间自动填充实践

    Mybatis-plus配置之日期时间自动填充实践

    本文介绍如何使用MyBatis-Plus的MetaObjectHandler接口实现新增和更新时间的自动填充,通过继承抽象类、添加注解及处理版本兼容性,简化开发流程并减少手动操作
    2025-08-08
  • 永久解决idea git log乱码的问题

    永久解决idea git log乱码的问题

    这篇文章主要介绍了永久解决idea git log乱码的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Java贪心算法超详细讲解

    Java贪心算法超详细讲解

    人之初性本善,但是随着自身的经历、生活环境等因素的影响,人逐渐会生出贪嗔痴。实际上不光人有贪念,我们的算法也会有贪念,今天就和大家介绍下一个有贪念的算法模型---贪心算法,看看一个算法是怎么产生贪念的
    2022-05-05

最新评论