服务器之家

服务器之家 > 正文

java 中file.encoding的设置详解

时间:2020-09-11 10:25     来源/作者:Java教程网

java 中file.encoding的设置详解

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

?
1
2
Properties pps=System.getProperties();
pps.setProperty("file.encoding","ISO-8859-1");

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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数组

?
1
(*env)->GetByteArrayRegion(env, bytes, off, len, (jbyte *)buf);

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

原文链接:http://blog.csdn.net/raintungli/article/details/6651076

标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
Intellij idea2020永久破解,亲测可用!!!
Intellij idea2020永久破解,亲测可用!!! 2020-07-29
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享 2020-04-07
电视剧《琉璃》全集在线观看 琉璃美人煞1-59集免费观看地址
电视剧《琉璃》全集在线观看 琉璃美人煞1-59集免费观看地址 2020-08-12
最新idea2020注册码永久激活(激活到2100年)
最新idea2020注册码永久激活(激活到2100年) 2020-07-29
返回顶部