zoukankan      html  css  js  c++  java
  • Java基础-IO流对象之字符类(FileWrite与FileReader)

               Java基础-IO流对象之字符类(FileWrite与FileReader)

                                          作者:尹正杰

    版权声明:原创作品,谢绝转载!否则将追究法律责任。

    一.常见编码简介

    1>ASCII

      我们知道计算机是由外国人发明的,他们当时也没有考虑到全球都用到计算机,因此在设计编码的时候压根就没有考虑中文,日文,泰文等等,而是仅仅将英文大小写和标点符号等一些特殊字符考虑进去了,这种编码格式被称为ASCII编码,每个字母或特殊字符都会用8个“0”和“1”的二进制组合进行标识,聪明的小伙伴估计口算都能算出来2的八次方是多少了,没错是256个,也就是说用8个连续的“0”或者“1“是没有办法表示所有国家的语言的。因为它最大上限就是256个字符存储。比如我们要保存一个大写的字母”A“就需要一个字节,用二进制表示则为:“0100 0001”

    2>.gb2312和gbk

      这种编码格式就是为了解决ASCII无法存储汉字的情况而诞生的,也就是说gb2312可以存储我们的汉字,而gbk只是对gb2312的一个补充,它主要补充了中国的繁体字。这两种编码格式都可以存储ASCII的所有字符且可以存储所有的中国字符,也就是说你开发了一个中国人的游戏,如果你将这游戏放在日本,泰国等国家的电脑上安装的话可能无法运行,因为他们的电脑安装的操作系统也是他们的母语哟。gb2312和gbk编码在存储汉字上要比utf8要好的多,因为utf8在存储一个汉字的时候需要3个字节(即24位)进行存储,而gbk只需要2个字节就可以搞定,占用空间较少。

    3>.万国码

      但是随着计算机的快速发展,其他国家也有需求存入相应国家的文字(如中国出现了gbk编码,日本出现了Shift_JIS编码,韩国出现了Euc-kr编码等等。),因此又出现了一种能够存储各个国家的编码,我们称之为“万国码”(即Unicode),支持大多数个国家的语言文字。它有一个下限要求,就是美国字符都必须用最少16位(两个字节)来进行存储,也就是说要用连续的16个”0“和”1“的二进制数字来表示一个字符,没错,这种编码格式能够保存所有的ASCII的字符,只不过之前用一个字节存取的ASCII编码,现在要用两个字节进行存取。比如存取一个大写的“A”,用二进制表示则为:”000000000100 0001“,很明显,浪费了空间。本来用8位就可以存储的现在却用了16位来进行存储。而存储一个普通的中国汉字只需要用3个字节来存取,也就是24位来进行存储,即连续的24个“0”或者“1”来进行存储。甚至如果出现更复杂的文字可能需要用4到5个字节来进行存储。

    4>.UTF8

      我们刚刚也提到万国码的确是不错的,因为它能存几乎所有国家的语言和文字,但是缺陷就是对每个字符的存储空间最小必须是2个字节,这在存储一些简单的字符很明显就是浪费空间呢,于是又兴起了另外一种编码UTF-8,我们称之为可变长字符编码。它实际上是对万国码的一种压缩,能够用最少的位数表示一个字符(每个字符表示最少是8位,即一个字节)。换句话说,一个英文字符就用一个字节来表示(按照之前ASCII的方式来存取),而存储汉字还是按照万国码的方式进行存储,即3个字节表示一个汉字。

    5>.推荐使用的编码格式

      我们知道编码格式有很多种,虽然gbk存储汉字要比utf8要节省空间,但是我们还是推荐使用utf8编码格式,原因有三:

        第一,gbk并没有包含其它国家的文字;

        第二,很多开源软件使用的都是外国人开发的,他们大多数都是使用utf8编码格式;

        第三,Python3.x解释器默认使用utf-8方式进行编码和解码(当然你也可以指定编码格式);

      想要了解更多编码的知识请参考:http://www.cnblogs.com/yinzhengjie/p/7518172.html

     

     

    二.字符输出流写文本FileWriter类

       java.io.Writer是写入字符流的抽象类,换句话说,它是所有字符输出流的超类。

      作用:将内存中的字符写入到文本中。这里演示的是它常用的子类对象,即FileWriter。

     1 /*
     2 @author :yinzhengjie
     3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
     4 EMAIL:y1053419035@qq.com
     5 */
     6 
     7 package cn.org.yinzhengjie.note5;
     8 
     9 import java.io.FileWriter;
    10 import java.io.IOException;
    11 
    12 public class WriterDemo {
    13     public static void main(String[] args) throws IOException {
    14         FileWriter fw = new FileWriter("yinzhengjie.txt");
    15         //写入字符串
    16         fw.write("尹正杰");
    17         //将内存中的数据刷新到文件中
    18         fw.flush();
    19         //写入一个字符串数组
    20         char[] buf = {'a','b','c','d','e'};
    21         fw.write(buf);
    22         //写入一个字符串数组的一部分
    23         fw.write(buf, 1, 3);
    24         //写入一个字符
    25         fw.write(97);
    26         //释放资源,其实在释放资源时会默认调用flush方法。
    27         fw.close();
    28     }
    29 }

    三.字符输入流读取文本FileReader类

       java.io.Reader是字符输入流读取文本文件的抽象类,它也是所有字符输入流的超类。

      作用:专门读取文本文件 ,我们这里演示的是FileReader。

    尹正杰abcdebcda
    yinzhengjie.txt 文本内容
     1 /*
     2 @author :yinzhengjie
     3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
     4 EMAIL:y1053419035@qq.com
     5 */
     6 
     7 package cn.org.yinzhengjie.note5;
     8 
     9 import java.io.FileReader;
    10 import java.io.IOException;
    11 
    12 public class ReaderDemo {
    13     public static void main(String[] args) throws IOException {
    14         FileReader fr = new FileReader("yinzhengjie.txt");
    15         /*
    16         //按照单个字符读取
    17         int len;
    18         while((len = fr.read()) != -1) {
    19             System.out.print((char)len);
    20         }
    21         fr.close();
    22         */
    23         
    24         //按照字节数组的方式读取
    25         char[] buf = new char[4096];
    26         int len = 0;
    27         while((len = fr.read(buf)) != -1) {
    28             System.out.println(new String(buf,0,len));
    29         }
    30         
    31     }
    32 }
    33 
    34 /*
    35 以上代码执行结果如下:
    36 尹正杰abcdebcda
    37 */

    四.字符流复制文本文件

     1 /*
     2 @author :yinzhengjie
     3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
     4 EMAIL:y1053419035@qq.com
     5 */
     6 
     7 package cn.org.yinzhengjie.note5;
     8 
     9 import java.io.FileReader;
    10 import java.io.FileWriter;
    11 import java.io.IOException;
    12 
    13 public class CopyFile {
    14     public static void main(String[] args) {
    15         FileReader fr = null;
    16         FileWriter fw = null;
    17         
    18         try {
    19             fr = new FileReader("yinzhengjie.txt");
    20             fw = new FileWriter("yinzhengjie.backup");
    21             
    22             char[] buf = new char[4096];
    23             int len ;
    24             while(( len = fr.read(buf)) != -1 ) {
    25                 fw.write(buf, 0, len);
    26                 fw.flush();
    27             }
    28         } catch (Exception e) {
    29             throw new RuntimeException("复制失败!");
    30         }finally {
    31             try {
    32                 if(fw != null) {
    33                     fw.close();
    34                 }
    35             }catch(IOException e) {
    36                 throw new RuntimeException("释放资源失败!");
    37             }finally {
    38                 try {
    39                     if(fr != null) {
    40                         fr.close();
    41                     }
    42                 }catch(IOException e) {
    43                     throw new RuntimeException("释放资源失败!");
    44                 }
    45             }
    46         }
    47     }
    48 }

     

  • 相关阅读:
    Bzoj 4408: [Fjoi 2016]神秘数 可持久化线段树,神题
    Bzoj 4034: [HAOI2015]T2 树链剖分,子树问题,dfs序
    Bzoj 1984: 月下“毛景树” 树链剖分
    面试题14:调整数组顺序使奇数位于偶数前面
    面试题13:在O(1)时间删除链表结点
    面试题12:打印1到最大的n位数
    面试题11:数值的整数次方
    面试题10:二进制中1的个数
    [找程序员代写推荐]不要说你工作多久,多厉害!这些题不从网上找答案,你能做出来吗???
    [原]Android开发技巧--ListView
  • 原文地址:https://www.cnblogs.com/yinzhengjie/p/8970081.html
Copyright © 2011-2022 走看看