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。

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

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

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

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

尹正杰abcdebcda

yinzhengjie.txt 文本内容

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note5; import java.io.FileReader;
import java.io.IOException; public class ReaderDemo {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("yinzhengjie.txt");
/*
//按照单个字符读取
int len;
while((len = fr.read()) != -1) {
System.out.print((char)len);
}
fr.close();
*/ //按照字节数组的方式读取
char[] buf = new char[4096];
int len = 0;
while((len = fr.read(buf)) != -1) {
System.out.println(new String(buf,0,len));
} }
} /*
以上代码执行结果如下:
尹正杰abcdebcda
*/

四.字符流复制文本文件

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note5; import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException; public class CopyFile {
public static void main(String[] args) {
FileReader fr = null;
FileWriter fw = null; try {
fr = new FileReader("yinzhengjie.txt");
fw = new FileWriter("yinzhengjie.backup"); char[] buf = new char[4096];
int len ;
while(( len = fr.read(buf)) != -1 ) {
fw.write(buf, 0, len);
fw.flush();
}
} catch (Exception e) {
throw new RuntimeException("复制失败!");
}finally {
try {
if(fw != null) {
fw.close();
}
}catch(IOException e) {
throw new RuntimeException("释放资源失败!");
}finally {
try {
if(fr != null) {
fr.close();
}
}catch(IOException e) {
throw new RuntimeException("释放资源失败!");
}
}
}
}
}

最新文章

  1. UVA 11624 Fire!
  2. hdu 1312(DFS)
  3. VS2008 工程只生成dll不生成lib的解决方案
  4. struts2 插件使用
  5. xcode 自定义Eclipse里边常用的快捷键
  6. iframe更新与隐藏
  7. iOS 导入第三方文件夹时右侧出现问号
  8. 怎么直接让火狐输入json数据,而不是弹出文件保存对话框?
  9. [置顶] Jquery学习总结(二) jquery选择器详解
  10. 转:c的回归-云风
  11. hive[3] 数据类型和文件格式
  12. python 中@property的使用
  13. Java中PreparedStatement和Statement的用法区别(转)
  14. windows下定时利用bat脚本实现ftp上传和下载
  15. [BZOJ2879] [Noi2012] 美食节 (费用流 & 动态加边)
  16. PL-SVO公式推导及代码解析:地图点重投影和特征对齐
  17. CCF-CSP 第三题字符串整理(模拟大法好)
  18. IIS发布错误及解决
  19. Codeforces 15 E. Triangles
  20. Architecture.SOLID-Principles

热门文章

  1. Linux读书笔记第一、二章
  2. Task 10 统计从1到某个整数之间出现的1的次数
  3. java 事务
  4. b1
  5. python learning Process and Thread.py
  6. Team饭来了团队作业3需求改进与系统设计
  7. FineReport基本使用
  8. beta 发布的相关评论
  9. 常见meta标签记录
  10. poj 3368(RMQ模板)