java 中file.encoding的设置详解

 更新时间:2017年04月14日 10:57:32   投稿:lqh  
这篇文章主要介绍了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); 

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

相关文章

  • Java String 和StringBuffer的详解及区别

    Java String 和StringBuffer的详解及区别

    这篇文章主要介绍了Java String 和StringBuffer的详解及区别的相关资料,需要的朋友可以参考下
    2017-05-05
  • Java实现猜数字小游戏(有次数限制)

    Java实现猜数字小游戏(有次数限制)

    这篇文章主要为大家详细介绍了Java实现猜数字小游戏,有次数限制,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • Java中ReentrantLock和ReentrantReadWriteLock的原理

    Java中ReentrantLock和ReentrantReadWriteLock的原理

    这篇文章主要介绍了Java中ReentrantLock和ReentrantReadWriteLock的原理,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-09-09
  • Spring-boot JMS 发送消息慢的解决方法

    Spring-boot JMS 发送消息慢的解决方法

    这篇文章主要为大家详细介绍了Spring-boot JMS 发送消息慢的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • SpringBoot实现发送短信的示例代码

    SpringBoot实现发送短信的示例代码

    这篇文章主要介绍了SpringBoot实现发送短信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Idea 中控制启动命令的详细过程 区分环境案例详解

    Idea 中控制启动命令的详细过程 区分环境案例详解

    这篇文章主要介绍了Idea 中控制启动命令的详细过程 区分环境案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • Java spring注解@PostConstruct实战案例讲解

    Java spring注解@PostConstruct实战案例讲解

    我们在Spring项目中经常会遇到@PostConstruct注解,可能有的伙伴对这个注解很陌生,下面这篇文章主要给大家介绍了关于Java spring注解@PostConstruct实战案例讲解的相关资料,需要的朋友可以参考下
    2023-12-12
  • IntelliJ IDEA最佳配置(推荐)

    IntelliJ IDEA最佳配置(推荐)

    这篇文章主要介绍了IntelliJ IDEA最佳配置,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • Springboot整合mybatisplus的项目实战

    Springboot整合mybatisplus的项目实战

    本文主要介绍了Springboot整合mybatisplus的项目实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Java定时器问题实例解析

    Java定时器问题实例解析

    这篇文章主要结合实例介绍了java当中的定时器的一些问题,有需要的朋友可以参考一下
    2017-04-04

最新评论