java file 初始化_java 中file.encoding的设置详解

java 中file.encoding的设置详解

昨天有人在讨论关于设置system的property,file.encoding 修改defaultcharset无效

properties pps=system.getproperties();

pps.setproperty("file.encoding","iso-8859-1");

在java中,如果没有指定charset的时候,比如new string(byte[] bytes),都会调用charset.defaultcharset()的方法

public static charset defaultcharset() {

if (defaultcharset == null) {

synchronized (charset.class) {

java.security.privilegedaction pa =

new getpropertyaction("file.encoding");

string csn = (string)accesscontroller.doprivileged(pa);

charset cs = lookup(csn);

if (cs != null)

defaultcharset = cs;

else

defaultcharset = forname("utf-8");

}

}

return defaultcharset;

}

我们可以清楚的看到defaultcharset是只能被初始化一次,这里还是有点小问题的,在多线程并发调用的时候还是会初始话多次,当然后面都是从cache(lookup的函数)里读出来的,问题也不大。

当我们在改变system.getproperties里的file.encoding 的时候,defaultcharset已经被初始化过了,所以不会在调用初始话的代码。

当jvm 启动的时候,load class, 最后调用main函数之前,defaultcharset已经初始化好,而很多函数里都掉用了这个方法象string.getbytes, 还有 inputstreamreader, inputstreamwriter 都是调用了 charset.defaultcharset()的方法,就不去追查谁先调用了defaultcharset。

对defaultcharset,在jvm里的语言就是初始话在启动的时候,而且不可被更改,你只能修改系统的charset,或者jvm的启动参数里加上 -dfile.encoding="utf-8"

题外话

在java里面string是使用char数组来表示,而java的char和c的char是不同的,java的char是双字节的, 而c 里面的char单字节,等同于java byte

也就是说我们在转化byte 到string的时候,是根据charset decode转化成char, 而我们在调用println,write string的时候,还是要把char最后encode成byte 输出到控制台,或者文件中。

而在最后调用c函数write 的时候,如果是java 的byte数组,还要转化成c 里的char数组

(*env)->getbytearrayregion(env, bytes, off, len, (jbyte *)buf);

感谢阅读,希望能帮助到大家,谢谢大家,对本站的支持!

希望与广大网友互动??

点此进行留言吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值