JAVA--IO--乱码

一、

IO的乱码往往出现字符流中,可在字节流向字符流转换的时候处理,如:

new InputStreamReader(new FileInputStream(file),"UTF-8")

二、

或者直接使用字节流

new String(sb.toString().getBytes("ISO-8859-1"), "UTF-8")//注:sb是字节流的简单拼装

 

 

在字节转向字符流时,如果不指定则默认取自入口函数所在的JAVA文件的编码值。分析如下:

//在创建时可以指定字符集
public InputStreamReader(InputStream in, String charsetName){
sd = StreamDecoder.forInputStreamReader(in, this, charsetName);
}
//如果没有指定则获取默认值
public static StreamDecoder forInputStreamReader(InputStream inputstream, Object obj, String s){
        String s1 = s;
        if(s1 == null)
            s1 = Converters.getDefaultEncodingName();
        if(!Converters.isCached(0, s1))
           。。。    
}
//默认值来自System.getProperty
public static String getDefaultEncodingName(){
GetPropertyAction getpropertyaction = new GetPropertyAction("file.encoding");//这里取自System.getProperty(变量)
        return defaultEncoding;
    }

 

 System.getProperty值的来源:首先并不是操作系统os的默认编码

 

问题1:file.encoding的值是什么呢?  这个一开始我认为是操作系统的编码

但我错了,它的值为保存每个程序的main入口的那个java文件的保存编码(点击文件-->属性-->text file encoding(other的值),这是使用eclipse 编译器)

通过以下的代码即可证明:

/**
 * Test.java源代码文件
 */
public class Test { 
    public static void main(String[] args) { 
        System.out.println(System.getProperty("file.encoding")); 
        //Test2.printEncoding();
    } 
}

 

1、文件保存的编码为:GB2312 时

编译执行之后,得到的结果为:

GB2312

2、文件保存的编码为:GBK 时

编译执行之后,得到的结果为:

GBK

3、文件保存的编码为:UTF-8时

编译执行之后,得到的结果为:

UTF- 8

从上面的三个结果可以看出,file.encoding的值并不是操作系统os的默认编码

而是main入口函数所在的类的保存编码.

但是这时想到了另一个问题,

问题2:是不是每个java文件都有自己的file.encoding呢?

于是我写了另一个类做试验,添加了类文件Test2.java

/**
 * Test2.java源代码文件
 */
public class Test2 {
    public static void printEncoding(){
        System.out.println(System.getProperty("file.encoding"));
    }
}

 

并将源文件Test.java的代码修改为:

/**
 * Test.java源代码文件
 */
public class Test { 
    public static void main(String[] args) { 
        System.out.println(System.getProperty("file.encoding")); 
        Test2.printEncoding();//添加了这个命令
    } 
}

 

这时我将Test.java的保存编码设置为:utf-8

将Test2.java的保存编码设置为:GBK

根据问题2我最原始的假设那么

编译运行这两个文件之后得到的结果应该为:

utf- 8
GBK

  

但事实是运行后的结果为:

utf- 8
utf- 8

于是得出了结论是:

在一个运行的应用程序中

file.encoding的值只有一个,并且值为入口函数的保存编码的值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值