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) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.对象的序 ...
随机推荐
- Daily Scrum (2015/10/28)
昨天DEV们完成了一部分代码风格的修整.今晚在与其他组进行交流时我们发现我们的代码是需要在服务器上运行的,而且服务器是需要配置的,而且据说需要花一些时间.所以在编写代码之前PM提出我们应该先把服务器搭 ...
- Trick and Magic(OO博客第二弹)
代码是设计,不是简单的陈述.而设计不仅要求功能的正确性,更注重设计风格和模式. 真正可以投入应用的程序设计,不是那种无脑的“黑箱”,超巨大的数组,多重循环暴力搜索,成吨全局变量……事实上,在实际应用中 ...
- binding(转)
1,Data Binding在WPF中的地位 程序的本质是数据+算法.数据会在存储.逻辑和界面三层之间流通,所以站在数据的角度上来看,这三层都很重要.但算法在3层中的分布是不均匀的,对于一个3层结构的 ...
- JavaWeb:HttpSession(一)
Session机制: 1).session机制采用的是在服务器端保持 HTTP 状态信息的方案 . 2).当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否包含 ...
- 三公网络监督平台APP上线,源代码出售。
- 转 JS模块化简单实现
git示例地址:https://github.com/wufenfen/requireJS-Demo.git
- Windows10 桌面显示 我的电脑
桌面上面有我的电脑还是非常方便的 但是 不激活有时候没法选择: 方法 桌面空白处右键---个性化 然后在 个性化- 主题- 桌面图标设置 增加即可.
- BugScan插件编写高(gǎo)级(jī)教程
声明:本文最先发布在:http://q.bugscan.net/t/353 转载请注明出处 有问题可以和我交流 邮件(Medici.Yan@gmail.com) 个人博客地址:http://www.c ...
- JavaScript的setTimeout()和setInterval()
1. setTimeout()方法 作用:在制定的毫秒数后调用函数或计算表达式 语法: setTimeout(code,millisec) 实例: function timedMsg() { var ...
- BZOJ3162 独钓寒江雪(哈希+树形dp)
数独立集显然是可以树形dp的,问题在于本质不同. 假设已经给树确立了一个根并且找到了所有等效(注意是等效而不是同构)子树,那么对转移稍加修改使用隔板法就行了. 关键在于找等效子树.首先将树的重心(若有 ...