Java基础-IO流对象之字符类(FileWrite与FileReader)
html
做者:尹正杰
java
版权声明:原创做品,谢绝转载!不然将追究法律责任。数组
一.常见编码简介ide
1>ASCII编码
咱们知道计算机是由外国人发明的,他们当时也没有考虑到全球都用到计算机,所以在设计编码的时候压根就没有考虑中文,日文,泰文等等,而是仅仅将英文大小写和标点符号等一些特殊字符考虑进去了,这种编码格式被称为ASCII编码,每一个字母或特殊字符都会用8个“0”和“1”的二进制组合进行标识,聪明的小伙伴估计口算都能算出来2的八次方是多少了,没错是256个,也就是说用8个连续的“0”或者“1“是没有办法表示全部国家的语言的。由于它最大上限就是256个字符存储。好比咱们要保存一个大写的字母”A“就须要一个字节,用二进制表示则为:“0100 0001”spa
2>.gb2312和gbk操作系统
这种编码格式就是为了解决ASCII没法存储汉字的状况而诞生的,也就是说gb2312能够存储咱们的汉字,而gbk只是对gb2312的一个补充,它主要补充了中国的繁体字。这两种编码格式均可以存储ASCII的全部字符且能够存储全部的中国字符,也就是说你开发了一个中国人的游戏,若是你将这游戏放在日本,泰国等国家的电脑上安装的话可能没法运行,由于他们的电脑安装的操做系统也是他们的母语哟。gb2312和gbk编码在存储汉字上要比utf8要好的多,由于utf8在存储一个汉字的时候须要3个字节(即24位)进行存储,而gbk只须要2个字节就能够搞定,占用空间较少。设计
3>.万国码code
可是随着计算机的快速发展,其余国家也有需求存入相应国家的文字(如中国出现了gbk编码,日本出现了Shift_JIS编码,韩国出现了Euc-kr编码等等。),所以又出现了一种可以存储各个国家的编码,咱们称之为“万国码”(即Unicode),支持大多数个国家的语言文字。它有一个下限要求,就是美国字符都必须用最少16位(两个字节)来进行存储,也就是说要用连续的16个”0“和”1“的二进制数字来表示一个字符,没错,这种编码格式可以保存全部的ASCII的字符,只不过以前用一个字节存取的ASCII编码,如今要用两个字节进行存取。好比存取一个大写的“A”,用二进制表示则为:”000000000100 0001“,很明显,浪费了空间。原本用8位就能够存储的如今却用了16位来进行存储。而存储一个普通的中国汉字只须要用3个字节来存取,也就是24位来进行存储,即连续的24个“0”或者“1”来进行存储。甚至若是出现更复杂的文字可能须要用4到5个字节来进行存储。htm
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
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 }