Java读写.properties⽂件解决中⽂乱码问题
⼀般使⽤到properties配置⽂件,⼀般都是在spring项⽬⾥⾯,直接由框架帮你读,当然,你也得考虑到编码的问题。
但是现在要是要求使⽤Java直接读写properties⽂件,就发现很多的问题,⽐如,我的properties⽂件的编码竟然不是utf-8的。或者说我压根就没考虑到这个问题。再⽐如,当properties⽂件⾥⾯有汉⼦的时候,发现读写的汉字乱码了,在我这是因为我的电脑默认编码是gbk,但是读的时候,⼜没有设置编码,搞出的问题。下⾯直接上代码,看问题。
package com.lxk.propertyFileTest;
import java.io.*;
import java.util.Properties; /**
* 读写properties⽂件测试 *
* 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每次都是清空再重写
prop.setProperty(\"phone\
//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⽂件测试 *
* 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\ FileOutputStream oFile = null; try {
//保存属性到b.properties⽂件
oFile = new FileOutputStream(\"b.properties\表⽰追加打开,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编码之后,运⾏的结果,就有⼀丢丢不⼀样。继续参见下图:
看到多了⼀个⼩杠“”-“”,具体怎么解释,我暂时还不清楚。
这个时候,写出来的⽂件的,也同样出现了这个问题,具体还是继续参见下图:
所以,这个我暂时解释不了。惭愧。。。。
还有个问题就是:读出来的属性,是不按原来⽂件中的顺序展⽰的,当然写的时候,也是乱序的。这还是个问题,还有待解决。什么时候解决了,再在此处留个链接。链接:
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。