java读取配置文件properties乱码问题

版权声明:来一来,看一看,有钱的捧个人场,没钱的你不得捧个人场 https://blog.csdn.net/wait_for_eva/article/details/81449248

常见用法

public static void main(String[] args) throws FileNotFoundException, IOException {
		Properties prop = new Properties();
		prop.load(new FileInputStream(new File("filename")));
	}

通常没有严格规范的时候,使用properties进行服务配置是非常方便快捷的,尤其是加载配置内容时,简单的load就可以完成加载。

而且对于配置获取,没有特殊要求的封装,直接对属性名称进行获取也是十分方便。

注意前置contains判断,并打出属性key,这样更能及时发现和定位错误。

乱码时刻

但是这种办法在某些场景下,就会让人抓狂。比如?乱码了。

直接的简单加载是没办法指定编码格式的,而差异由此而来。

properties默认使用的是os指定的文件编码,一般情况下,不会出现问题,即使有些许的问题,在eclipse或IDEA中修改文件编码或properties编码问题就会得到解决。

但是当windows的程序打包然后部署到linux上?文件乱码就会让人气炸,但是却无可奈何。

恰好的编码对上了,这些问题便不存在,只是经过各种体位的修改linux文件类型,我才发现这东西对于细节的处理的确迷惑了很多人。

总结一下,乱码原因有二

  1. properties默认使用os默认字符编码,机器不同,字符集有差异
  2. 文件类型不对,也会读出乱码

解决办法

解决办法也是两方面

  1. 统一os字符编码
  2. 针对文件指定字符集

对于第一种,意义的确不大。

因为你不可能把所有的机器做统一,尤其是系统做大了的时候;而且运维人员的个人习惯差异,这是强求不来的。

而且,程序讲究的是普适,是鲁棒性,因此专门针对第二点动手

第二种嘛,和os不再相关,到哪都一样(如果是跨平台语言的话)

注意两点

  1. 程序指定编码
  2. 修改文件编码
	public static void main(String[] args) throws FileNotFoundException, IOException {
		Properties prop = new Properties();
		prop.load(new InputStreamReader(new FileInputStream("filename"), "UTF-8"));
	}

嗯,回顾一下IO流

字节流

    二进制码流,对于所有文件通用,未编码直接是Unicode

字符流

    专门针对语言文字封装的文件流,支持对各编码字符集的操作,对文本的处理比字符流更快速。

    但是仅仅针对字符文本文件,对音频或视频等文件进行操作会损坏文件。

好吧,不用多说,properties配置是文本文件,字符流是支持的,然后指定一下编码字符集就ok了。

然后加载的时候,和os与os的默认字符集就没多大关系了。

接下来唯一的问题就是文本文件的字符集问题了,接下来介绍一下linux下的文本字符集修改和查看操作。

file

file filename

查看文件字符集

当windows直接上传的时候还有特殊提示哦

CRLF,所以window上传到linux的文本最好dos2unix一下

:set fenc="UTF-8"

熟悉vi的就不多说了,设定文件编码,统一一下就好了,文件编码就是读取文件时指定的编码。

iconv

这个嘛,主要协助工作,也可以换换口味。

iconv -l

查看linux支持的字符集

iconv -f from_encoding -t to_encoding filename

外部修改,指定文件从from_encoding转码到to_encoding

iconv filename -f from_encoding -t to_encoding -o new_filename 

转码内容输出到指定文件,当然了,也可以手动指定输出

iconv -f from_encoding -t to_encoding filename > new_filename

 

over,反正问题不大。

猜你喜欢

转载自blog.csdn.net/wait_for_eva/article/details/81449248
今日推荐