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); 

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

(0)

相关推荐

  • Java File类的常用方法总结

    Java File类的功能非常强大,利用Java基本上可以对文件进行所有的操作.本文将对Java File文件操作类进行详细地分析,并将File类中的常用方法进行简单介绍,有需要的Java开发者可以看一下. 构造函数 复制代码 代码如下: public class FileDemo {      public static void main(String[] args){          //构造函数File(String pathname)          File f1 =new Fi

  • 详解Java中的File文件类以及FileDescriptor文件描述类

    File File 是"文件"和"目录路径名"的抽象表示形式. File 直接继承于Object,实现了Serializable接口和Comparable接口.实现Serializable接口,意味着File对象支持序列化操作.而实现Comparable接口,意味着File对象之间可以比较大小:File能直接被存储在有序集合(如TreeSet.TreeMap中). 1. 新建目录的常用方法 方法1:根据相对路径新建目录. 示例代码如下(在当前路径下新建目录"

  • java File类的基本使用方法总结

    Java IO中File的使用是比较频繁的,在文件的上传和删除中都会用到的.比如我们在写管理系统的时候有可能会用到图片的上传,和删除.那么我们就会用到Java的 File来处理. Java中File的基本使用创建和删除文件: public class FileDemo { public static void main(String[] args) { File f=new File("d:"+File.separator+"io.txt"); //File.sep

  • java文件操作之Path,Paths,Files

    Java7中文件IO发生了很大的变化,专门引入了很多新的类: import java.nio.file.DirectoryStream; import java.nio.file.FileSystem; import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.attribute.

  • 基于java file 文件操作operate file of java的应用

    java文件操作 复制代码 代码如下: package com.b510; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.InputStream; import java.io.PrintWriter; /**  *   * @author Hongten</br>  *   *    

  • Java使用File类遍历目录及文件实例代码

    1. 构造函数 File(String args0)//使用一个表示文件或目录的路径的字符串创建一个File对象 File(URL args0)//使用一个URL对象创建File对象 File(File args0, String args1)//使用一个File对象(一般是目录)和一个文件名字符串创建File对象 File(String args0, String args1)//使用一个目录字符串和一个文件名字符串创建对象 使用File类需要注意两点: 第一,File类用于表示文件或目录的名

  • File的API和常用方法详解_动力节点Java学院整理

    File 介绍 File 是"文件"和"目录路径名"的抽象表示形式. File 直接继承于Object,实现了Serializable接口和Comparable接口.实现Serializable接口,意味着File对象支持序列化操作.而实现Comparable接口,意味着File对象之间可以比较大小:File能直接被存储在有序集合(如TreeSet.TreeMap中). File 函数列表 // 静态成员 public static final String pat

  • java文件操作工具类分享(file文件工具类)

    复制代码 代码如下: import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.Fil

  • Java 的 FileFilter文件过滤与readline读行操作实例代码

    复制代码 代码如下: package com.cjonline.foundation.evisa; import java.io.BufferedReader;import java.io.File;import java.io.FileFilter;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStreamReader;import java.math.BigDecimal; publ

  • java中File类的使用方法

    构造函数 复制代码 代码如下: public class FileDemo {     public static void main(String[] args){         //构造函数File(String pathname)         File f1 =new File("c:\\abc\\1.txt");         //File(String parent,String child)         File f2 =new File("c:\\a

随机推荐