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文件类型,我才发现这东西对于细节的处理的确迷惑了很多人。
总结一下,乱码原因有二
解决办法也是两方面
对于第一种,意义的确不大。
因为你不可能把所有的机器做统一,尤其是系统做大了的时候;而且运维人员的个人习惯差异,这是强求不来的。
而且,程序讲究的是普适,是鲁棒性,因此专门针对第二点动手
第二种嘛,和os不再相关,到哪都一样(如果是跨平台语言的话)
注意两点
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,反正问题不大。