`

关于java.util.Properties读取中文乱码的正确解决方案(不要再用native2ascii.exe了)

阅读更多

 

从Spring框架流行后,几乎根本不用自己写解析配置文件的代码了,
但近日一个基础项目(实在是太基础,不能用硕大繁琐的Spring),

碰到了用java.util.Properties读取中文内容(UTF-8格式)的配置文件,发生中文乱码的现象,

 

Properties prop=new Properties();       
prop.load(Client.class.getClassLoader().getResourceAsStream("config.properties"));

 

习惯性google了一下,网上大多数文章都是让大家用native2ascii.exe转换 这样的解决方案,一开始还差点被懵住了,以为只能使用这样的绕弯子方法。。。

 

但关键是,太绕了! 如果每次都用native2ascii.exe将中文转换成\uXXXX\uXXXX这样的,麻烦先不说,转换完后的文件完全不可读!!!这基本上是不可忍受的!
(虽然也能用native2ascii.exe转换回来,但同样,麻烦!)

冷静下来后,突然想起来,还是初学java时看过,java.io包中 Reader/Writer和Stream的区别。
(年代久远,具体细节忘记了,大概是:Reader/Write是处理编码文本的,而InputStream/OutputStream只把数据当作2进制流

正确解决方案

 

Properties prop=new Properties();       
prop.load(new InputStreamReader(Client.class.getClassLoader().getResourceAsStream("config.properties"), "UTF-8"));       

 

其中“UTF-8”,用于明确指定.properties文件的编码格式(不指定则默认使用OS的,这会造成同一份配置文件同一份代码,在linux和windows上、英文windows和中文windows之间的表现都不一致),这个参数应该和具体读取的properties文件的格式匹配。 

 

这个东西实在是基础,本来没啥好说的;但是网上流传的关于那个绕弯方法的文章太多了,太误导人了,还是写一下以正视听吧。

 

-------------------------------------------------------

后续:这两天发现,使用这种方法要注意一下,在linux下开发的.properties,如果要用到windows上,需要先用unix2dos 转换一下,否则可能发生配置项丢失的现象(可能是linux下的\r到了windows下不被Reader识别)。

 

5
4
分享到:
评论
6 楼 hft24dq 2016-02-16  
下面这种写法更好一些
String path = "d://properties.properties";
        Properties p = new Properties();
        Reader inStream = new InputStreamReader(new FileInputStream(path), "UTF-8");
        p.load(inStream);
5 楼 pig345 2011-11-09  
wangboak 写道
我想问下,这个
prop.load(new InputStreamReader(Client.class.getClassLoader().getResourceAsStream("config.properties"), "UTF-8"));  

中间的 new InputStreamReader 需要关闭吗?需要的话 怎么关闭?


上面只是个演示代码,你可以这样:
Properties prop = new Properties();
InputStream stream = Client.class.getClassLoader().getResourceAsStream("config.properties");
Reader reader = null;
try {
reader = new InputStreamReader(stream, "UTF-8");
prop.load(reader);
} catch (IOException e) {

// TODO 错误处理

} finally{
if (null != reader){
try {
reader.close();
} catch (IOException e) {
// ignore
}
}
}
4 楼 wangboak 2011-11-04  
我想问下,这个
prop.load(new InputStreamReader(Client.class.getClassLoader().getResourceAsStream("config.properties"), "UTF-8"));  

中间的 new InputStreamReader 需要关闭吗?需要的话 怎么关闭?
3 楼 pig345 2010-12-07  
xchao 写道
方法好是好,

不过我的怎么

prop.load(new InputStreamReader(Client.class.getClassLoader().getResourceAsStream("config.properties"), "UTF-8"));

load()方法没有这样参数列表的实现呢?

你用的是[img][/img][img]


你写错了,中间缺少new InputStreamReader(, "UTF-8"),这个reader才是关键阿!
2 楼 xchao 2010-12-02  
方法好是好,

不过我的怎么

prop.load(new InputStreamReader(Client.class.getClassLoader().getResourceAsStream("config.properties"), "UTF-8"));

load()方法没有这样参数列表的实现呢?

你用的是[img][/img][img]
1 楼 minfirefox 2010-08-05  


谢谢了!

相关推荐

    java.util.Date与java.sql.Date互转及字符串转换为日期时间格式.docx

    ### Java.util.Date与Java.sql.Date互转及字符串转换为日期时间格式 #### 一、Java.util.Date与Java.sql.Date的基本概念 在Java编程语言中,处理日期和时间时经常使用到`java.util.Date`和`java.sql.Date`这两个类...

    用java.util.zip包现数据压缩与解压

    ### 使用 Java.util.zip 包实现数据压缩与解压 在计算机科学领域,数据压缩技术是一项重要的功能,它能够帮助减少存储空间的需求以及提高网络传输效率。本文将通过一系列的示例来详细介绍如何利用 Java 中的 `java....

    java.util.Date与java.sql.Date相互转换

    ### Java.util.Date与Java.sql.Date相互转换 #### 知识点概述 在Java开发中,经常需要处理日期和时间相关的操作。Java标准库提供了两个重要的日期类:`java.util.Date` 和 `java.sql.Date`。虽然它们名字相似,但...

    java并发工具包 java.util.concurrent中文版用户指南pdf

    1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...

    Exception in thread “main“ java.util.InputMismatchException.pdf

    在Java编程语言中,`java.util.InputMismatchException`是一个常见的运行时异常,它通常发生在尝试从数据源(如控制台、文件或数据库)读取数据时,遇到的数据类型与预期的不匹配。在这个特定的场景中,问题出在主线...

    Tomcat内存溢出的解决方法(java.util.concurrent.ExecutionException)

    "java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError" 是一个典型的错误提示,它表明在并发执行过程中遇到了内存不足的问题。下面我们将深入探讨这个问题的原因、影响以及如何解决。 内存溢出...

    java 支持中文解压:一行代码解决 java.util.zip.ZipInputStream 中文乱码;--文件处理通用类

    1、文件解压zip通用机制方法、一行代码支持中文; 2、一行代码解决 java.util.zip.ZipInputStream 中文乱码; 3、删除指定路径内的所有文件通用机制方法;

    java.util.ConcurrentModificationException 异常问题详解1

    Java.util.ConcurrentModificationException 异常问题详解 ConcurrentModificationException 异常是 Java 中一个常见的异常,它发生在 Iterator 遍历集合时,集合同时被修改引起的异常。在 Java 中,集合类如 ...

    java.util.Date到Json日期

    ### Java.util.Date到JSON日期转换详解 在Java中处理日期并将其转换为JSON格式是常见的需求,尤其是在进行网络传输或存储操作时。本篇文章将详细介绍如何将`java.util.Date`对象转换为符合特定格式的JSON字符串,...

    java.util.logging.Logger使用详解

    ### Java.util.logging.Logger 使用详解 #### 一、创建Logger对象 在Java中,`java.util.logging.Logger` 是标准的日志框架之一,它提供了基础的日志记录功能。为了使用这一功能,首先需要获得 `java.util.logging...

    java.util包

    Java提供日期(Data)类、日历(Calendar)类,随机数(Random)类,堆栈(Stack)、向量(Vector) 、位集合(Bitset)以及哈希表(Hashtable)等类来表示相应的数据结构

    JAVA 解决Properties文件保存中文乱码

    本文将深入探讨如何在Java中解决Properties文件保存和读取中文乱码的挑战。 首先,我们需要理解Java默认使用ISO-8859-1编码来处理Properties文件。由于此编码不支持大部分中文字符,因此在保存或加载包含中文的...

    java.sql.date与java.util.date.pdf

    2. 若要插入到数据库并且相应的字段为Date类型可使用PreparedStatement.setDate(int,Java.sql.Date)方法,其中的Java.sql.Date可以用上面的方法得到。 3. 将"yyyy-mm-dd"格式的字符串转换为Java.sql.Date 方法1: ...

    改进java.util.Properties类,让输出格式与输入格式保持不变.

    总之,`SafeProperties`类是对`java.util.Properties`的一个增强,解决了在处理非ASCII字符和行结束符时可能出现的问题,确保了输入和输出的格式一致。这对于维护和管理包含特殊字符的配置文件至关重要。通过这种...

    java 读取properties配置文件内容乱码

    NULL 博文链接:https://liuzidong.iteye.com/blog/776637

    java.sql.与java.util

    例如,对于格式为"yyyy-mm-dd"的字符串,可以使用`SimpleDateFormat`的`parse()`方法将其转换为`java.util.Date`,然后再转换为`java.sql.Date`。如果需要插入数据库,还可以利用数据库特定的函数,如Oracle的`TO_...

    根据java.util.zip源码修改zip支持中文

    这是因为ZIP文件格式本身是支持Unicode编码的,但是Java的标准库在处理这些文件时默认使用了ISO-8859-1编码,这可能导致中文文件名显示为乱码或无法正确解压。 标题"根据java.util.zip源码修改zip支持中文"指的是...

    axis2解决 org.apache.axis2.util.JavaUtils.callStackToString问题

    总的来说,解决`org.apache.axis2.util.JavaUtils.callStackToString`问题需要对Axis2的架构和工作原理有一定理解,同时具备良好的问题排查和调试技巧。通过逐步分析和尝试,大多数问题都能得到解决。

Global site tag (gtag.js) - Google Analytics