当前位置: 首页 > 编程笔记 >

java 中file.encoding的设置详解

羊舌和安
2023-03-14
本文向大家介绍java 中file.encoding的设置详解,包括了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设置字型和颜色的方法详解,包括了使用Java设置字型和颜色的方法详解的使用技巧和注意事项,需要的朋友参考一下 Java绘图中,显示文字的方法主要有三种: (1)drawString(String str,int x,int y):在指定的位置显示字符串。 (2)drawChars(char data[],int offset,int length, int x, int

  • 本文向大家介绍Java 用反射设置对象的属性值实例详解,包括了Java 用反射设置对象的属性值实例详解的使用技巧和注意事项,需要的朋友参考一下 Java 用反射设置对象的属性值实例详解 Java 反射 创建对象的方法 1、通过Class对象的newInstance()方法,这种方法的局限是只能取调用默认的构造函数 2、通过取得Class对象的getConstructor方法取得Construtor

  • 本文向大家介绍详解slf4j+logback在java工程中的配置,包括了详解slf4j+logback在java工程中的配置的使用技巧和注意事项,需要的朋友参考一下 本文主要介绍一下slf4j+logback在java工程中的配置,面向的读者主要是已经对slf4j+logback有一定了解的同学,但是在文章开头也做了一些知识铺垫,下面咱们进入正题。 在介绍slf4j+logback配置之前,首先

  • 我在MS Windows 7上运行Java SE 8,同时使用Eclipse和Netbeans。通过运行以下程序,我意识到两个表达式中每个表达式的返回值都是不同的! 关于Charset.defaultCharset(),据说“返回默认字符集”,而关于file.encoding,我们被告知“默认字符集保存在JVM的系统属性file.encoding中”。所以,看起来Charset.defaultCh

  • 本文向大家介绍Android中检查、设置默认程序详解,包括了Android中检查、设置默认程序详解的使用技巧和注意事项,需要的朋友参考一下 Android作为一个伟大的系统,自然提供了设置默认打开程序的实现.在这篇文章中,我会介绍如何在Android系统中设置默认的程序. 在设置默认程序之前,无非有两种情况,一种是已经有默认的程序,另一种则是没有任何默认程序. 检测是否有默认的程序 检查是必须的,

  • 问题内容: 我有两个JDK,分别用于Java 6和7。 我想同时使用这两个项目。最初,我们仅针对1.6构建。我在项目设置中看到可以选择1.5、1.6 1.7作为编译器级别。 这些选项如何添加到IDE中?我从未安装过Java 1.5。假设我想要Java 1.4。我如何将其显示在列表中?我在我的IDE首选项中添加了两个不同的JRE,但是下拉菜单中没有这些。 问题答案: 你可以在中管理可用的编译器列表。

  • 问题内容: 在Java中设置断点如何工作?它仅基于源文件名和行号吗?类或方法名称是否也存在? 如果调试器中有旧版本的源代码并设置了断点,则逐步执行时光标会关闭。距离有多远?它会进入错误的方法中吗(如果该文件中有多个类,甚至是错误的类)? 当JVM中有多个同名的类时,会发生什么情况(如果您有多个类加载器,可能会发生这种情况)?他们都得到断点了吗? 在Web应用程序容器中,是否可以仅为一个Web应用程

  • 问题内容: 我正在用Java做一些Swing GUI,我想我的问题很简单。如何设置鼠标的位置? 问题答案: 您需要使用机器人 此类用于生成本机系统输入事件,用于测试自动化,自运行演示以及需要控制鼠标和键盘的其他应用程序。Robot的主要目的是促进Java平台实现的自动化测试。 使用类生成输入事件与将事件发布到AWT事件队列或AWT组件不同,因为事件是在平台的本机输入队列中生成的。例如,实际上将移动