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。
/*
@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("释放资源失败!");
}
}
}
}
}
Java基础-IO流对象之字符类(FileWrite与FileReader)的更多相关文章
- Java基础-IO流对象之File类
Java基础-IO流对象之File类 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.IO技术概述 回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下 ...
- Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader)
Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.字符缓冲流 字符缓冲流根据流的 ...
- java基础-IO流对象之Properties集合
java基础-IO流对象之Properties集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Properties集合的特点 Properties类表示了一个持久的属性集. ...
- Java基础-IO流对象之转换流(InputStreamReader与OutoutStreamWriter)
Java基础-IO流对象之转换流(InputStreamReader与OutoutStreamWriter) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.转换流概述 我们之前 ...
- Java基础-IO流对象之随机访问文件(RandomAccessFile)
Java基础-IO流对象之随机访问文件(RandomAccessFile) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.RandomAccessFile简介 此类的实例支持对 ...
- Java基础-IO流对象之内存操作流(ByteArrayOutputStream与ByteArrayInputStream)
Java基础-IO流对象之内存操作流(ByteArrayOutputStream与ByteArrayInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.内存 ...
- Java基础-IO流对象之数据流(DataOutputStream与DataInputStream)
Java基础-IO流对象之数据流(DataOutputStream与DataInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据流特点 操作基本数据类型 ...
- Java基础-IO流对象之打印流(PrintStream与PrintWriter)
Java基础-IO流对象之打印流(PrintStream与PrintWriter) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.打印流的特性 打印对象有两个,即字节打印流(P ...
- Java基础-IO流对象之序列化(ObjectOutputStream)与反序列化(ObjectInputStream)
Java基础-IO流对象之序列化(ObjectOutputStream)与反序列化(ObjectInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.对象的序 ...
随机推荐
- Chapter 1 概述
软件分为通用软件和应用软件,具有复杂.不可见和不断变化的特点:从出现到现在共经历了四个重要的发展阶段,但现在的软件发展依然存在着许多问题. 软件工程是采用工程的概念.原理.技术和方法来开发与维护软件, ...
- C# winForm调用WebService
C#winForm调用WebService的远程接口 创建一个WebService工程用例 添加服务引用 添加webService服务地址 输入命名空间名称 主要代码 测试成功截图 工程代码下载 新建 ...
- Linux操作系统(三)
文件系统: boot sector:记录引导文件 sb: super block 每个文件系统只有一个sb,其余black group均是它的备份 读写文件会进入到inode operation vf ...
- [BUAA_SE_2017]提问回顾
提问回顾 学期初疑问回答 学期初疑问博客 教材中说,PM在衡量需求时需要方方面面的能力与研究.可是,当下许多互联网IT公司只承担外包业务,即客户给什么需求就实现什么需求,甚至可能不要求其它先进的功能. ...
- BeTa阶段Day4
一.提供当天站立式会议照片一张 二.每个人的工作 1.讨论项目每个成员的昨天进展 刘阳航:优化障碍物生成. 林庭亦:调整难度设置. 郑子熙:改进UI,美化界面. 陈文俊:优化代码结构. 2.讨论项目每 ...
- Beta阶段DAY1
一.提供当天站立式会议照片一张 二.每个人的工作 1.讨论项目每个成员的昨天进展 刘阳航:了解了自己再beta阶段的安排,但因为考试,有心无力. 林庭亦:颜色设置的相关代码的查看. 郑子熙:和另一位组 ...
- SQL Server学习记录之获取每月每季度每年第一天和最后一天
DECLARE@dtdatetime SET@dt=GETDATE() DECLARE@numberint --1.指定日期该年的第一天或最后一天 --A. 年的第一天 SELECTCONVERT() ...
- 如何修改antd中表格的表头样式和奇偶行颜色交替
在做antd表格时通常会用到table组件,但是table的表头时给定的,那么怎么修改表头的颜色呢? 这里用的时less的写法,在全局环境中写,所有的table表头都会变成自己定义的颜色 定义好表头的 ...
- SET ANSI_NULLS ON,SET NOCOUNT ON,SET QUOTED_IDENTIFIER ON
SET ANSI_NULLS ONTransact-SQL 支持在与空值进行比较时,允许比较运算符返回 TRUE 或 FALSE. 通过设置 ANSI_NULLS OFF 可将此选项激活.当 ANSI ...
- Eclipse报错Project configuration is not up-to-date with pom.xml
1.问题 Description Resource Path Location Type Project configuration is not up-to-date with pom.xml. S ...