I/O流、字符集

1)InputStream、OutPutStream是输出输入的基础流,均为抽象类,提供了read和writer方法,所有的子类均实现read和writer方法,read在遇到输入源的结尾时返回-1。

2)Reader、Writer专门为Unicode文本设计的输入输出基础流,同样是抽象类亦提供了read和writer方法,read遇到文件结尾时返回-1。

3)流对象使用完记得及时调用close关闭流,释放资源,InputStream、OutPutStream、Reader、Writer实现的接口如下图所示:

4)运行平台的不同,导致文件的分隔符有可能不尽相同,Java提供了获取平台的文件分隔符,可以通过java.io.File.separator获取平台的文件分隔符。

5)字符集

由于JDK版本的变化,同一个字符集可能有多个别名,可以通过如下代码获取字符集的所有别名:

        Charset csetCharset = Charset.forName("euc-cn");
        Set<String> aliaseSet = csetCharset.aliases();
        for (String alia : aliaseSet) {
            System.out.println(alia);
        }

通过如下代码获取程序支持的字符集:

        SortedMap<String, Charset> charsetSortedMap = Charset.availableCharsets();
        for (String name : charsetSortedMap.keySet()) {            
            System.out.println(name);
        }

 6)字符编码

由于本地编码并不能表示所有的Unicode字符,所以如果某个字符不能表示将被转换为?,同样解码时无法识别的输入将会被转化成Unicode的“替代字符”(‘\uFFFD’)。

字符串编码解码代码如下:

     // 字符串编码
        String str="字符串编码解码";
        Charset charset=Charset.forName("GBK");
        ByteBuffer buffer= charset.encode(str);
        byte[]bytes=buffer.array();
         
        // 字符串解码
        ByteBuffer buffer2=ByteBuffer.wrap(bytes,0,bytes.length);
        CharBuffer charBuffer=charset.decode(buffer2);
        String result=charBuffer.toString();
        // 建议调用trim(),防止由于编码的问题导致解码后出现多余的空心方格
        System.out.println(result.trim());

 

posted @ 2017-05-04 17:48  YSP  阅读(298)  评论(0编辑  收藏  举报