IO流:字符流等

内容

1.转换流
	1.1 InputStreamReader类的使用
	1.2 OutputStreamWriter类的使用
2.缓冲流
	2.1 BufferedInputStream类的使用
	2.2 BufferedOutputStream类的使用
	2.3 BufferedReader类的使用
	2.4 BufferedWriter类的使用
3.内存流
4.标准输入输出流
5.对象流
6.RandomAccessFile类
7.Properties类
8.装饰者设计模式

目标

1.掌握转换流的使用
2.掌握缓冲流的使用
3.了解内存流的使用
4.了解标准输入输出流的使用
5.掌握对象流的使用
6.了解RandomAccessFile类的使用
7.了解Properties的使用
8.了解装饰者设计模式

第一节 转换流

	作用:

	a.实现字节流到字符流的转换
	b.解决中文乱码的问题
		GBK
		Unicode
		utf-8
	c.只有转换流才能指定读取和写入的字符集
1.1 InputStreamReader类
InputStreamReader:字节字符转换输入流,将字节输入流转换为字符输入流

代码实现:

 
1.2 OutputStreamWriter类
OutputStreamWriter:字节字符转换输出流,将字节输出流转换为字符输出流

代码实现:

 

第二节 缓冲流

作用:主要是为了增强基础流的功能而存在的,提高了流的工作效率【读写效率】
2.1 BufferedInputStream类
 
2.2 BufferedOutputStream类
 
2.3 BufferedReader类
 
2.4 BufferedWriter类
 

第三节 内存流

输入和输出都是从文件中来的,当然,也可将输出的位置设置在内存上,这就需要ByteArrayInputStream和ByteArrayOutputStream

	ByteArrayInputStream:将内容写入到内存中,是Inputstream的子类
	ByteArrayOutputStream:将内存中数据输出,是OutputStream的子类
	此时的操作应该以内存为操作点	

案例:完成一个字母大小写转换的程序

 
实际上以上操作很好体现了对象的多态。通过实例化其子类不同,完成的功能也不同,也就相当于输出的位置不同,如果是输出文件,则使用FileXxxx类。如果是内存,则使用ByteArrayXxx。

	总结:	
	 a.内存操作流的操作对象,一定是以内存为主准,不要以程序为准。
	 b.实际上此时可以通过向上转型的关系,为OutputStream或InputStream.
	 c.内存输出流在日后的开发中也是经常使用到,所以一定要重点掌握

第四节 标准输入输出流

Java的标准输入/输出分别通过System.in和System.out实现,默认情况下分别代表是键盘和显示器
 
 

第五节 对象流

流中流动的数据是对象
	如果将一个对象写入到本地文件中,被称为对象的序列化
	如果将一个本地文本中的对象读取出来,被称为对象发序列化

	注意:
		一个对象流只能操作一个对象,如果试图采用一个对象流操作多个对象的话,会出现EOFException【文件意外达到了文件末尾】

		如果向将多个对象序列化到本地,可以借助于集合,【思路:将多个对象添加到集合中,将集合的对象写入到本地文件中,再次读出来,获取到的仍然是集合对象,遍历集合】
 
注意:在使用对象流的时候,用于初始化对象流的参数只能是字节流(将对象转换为二进制的形式,然后再把二进制写入文件)

第六节 RandomAccessFile类

RandomAccessFile是用来访问那些保存数据记录的文件的,你就可以用seek( )方法来访问记录,并进行读写了。这些记录的大小不必相同;但是其大小和位置必须是可知的。但是该类仅限于操作文件

	RandomAccessFile不属于InputStream和OutputStream类系的。实际上,除了实现DataInput和DataOutput接口之外(DataInputStream和DataOutputStream也实现了这两个接口),它和这两个类系毫不相干,甚至不使用InputStream和OutputStream类中已经存在的任何功能;它是一个完全独立的类,所有方法(绝大多数都只属于它自己)都是从零开始写的。这可能是因为RandomAccessFile能在文件里面前后移动,所以它的行为与其它的I/O类有些根本性的不同。总而言之,它是一个直接继承Object的,独立的类

	RandomAccessFile不属于InputStream和OutputStream类系的。实际上,除了实现DataInput和DataOutput接口之外(DataInputStream和DataOutputStream也实现了这两个接口),它和这两个类系毫不相干,甚至不使用InputStream和OutputStream类中已经存在的任何功能;它是一个完全独立的类,所有方法(绝大多数都只属于它自己)都是从零开始写的。这可能是因为RandomAccessFile能在文件里面前后移动,所以它的行为与其它的I/O类有些根本性的不同。总而言之,它是一个直接继承Object的,独立的类

案例一:RandomAccessFile类的应用

 

案例二:RandomAccessFile 插入写示例

 

第七节 Properties类

是Map接口的一个实现类,并且是Hashtable的子类

	Properties文件中元素也是以键值对的形式存在的
 

第八节 装饰者设计模式

 要实现装饰者模式,注意一下几点内容:

		a.装饰者类要实现真实类同样的接口
		b.装饰者类内有一个真实对象的引用(可以通过装饰者类的构造器传入)
		c.装饰类对象在主类中接受请求,将请求发送给真实的对象(相当于已经将引用传递到了装饰类的真实对象)
		d.装饰者可以在传入真实对象后,增加一些附加功能(因为装饰对象和真实对象都有同样的方法,装饰对象可	以添加一定操作在调用真实对象的方法,或者先调用真实对象的方法,再添加自己的方法)
		e.不用继承
假设要制造添加甜蜜素和着色剂的馒头:

		a.需要生产一个正常馒头
		b.为节省成本(不使用玉米面),使用染色剂加入到正常馒头中
		c.和面,最后生产出染色馒头

代码实现:

 
 
 
 
 
 

总结

课前默写

1.使用转换流实现文件内容的拷贝

2.使用字符缓冲流实现文件内容的拷贝

作业

1.在电脑中盘下创建一个文件为HelloWorld.txt文件,判断他是文件还是目录,在创建一个目
录FileTest,之后将HelloWorld.txt移动到FileText目录下去

3.在程序中写一个"HelloJavaWorld你好世界"输出到操作系统文件Hello.txt文件中
4.从磁盘读取一个文件到内存中,再打印到控制台
5.统计一个含有英文单词的文本文件的单词个数
6.从磁盘读取一个文件到内存中,再打印到控制台
7.实现将一个文件夹中的一张图片拷贝到另外一个文件夹下
8.将上课关于不同的流实现拷贝的案例敲熟练
9.定义一个类Student,定义属性:学号、姓名和成绩,方法:show(显示个人信息)

	实例化几个Student对象,将这几个对象保存到student.txt文件中
	然后再将文件中的内容读取出来并且调用show方法

10.从控制台输入一个字符串,统计其中一个字符出现的次数
11.理解装饰者设计模式,并实现类似课堂案例的案例

面试题

1.BufferedReader属于哪种流,它主要是用来做什么的,它里面有那些经典的方法
2.怎么样把输出字节流转换成输出字符流,说出它的步骤
3.流一般需要不需要关闭,如果关闭的话在用什么方法,一般要在那个代码块里面关闭比较好,处理流是怎么关闭的,如果有多个流互相调用传入是怎么关闭的?
4.什么叫对象序列化,什么是反序列化,实现对象序列化需要做哪些工作
5.在实现序列化接口是时候一般要生成一个serialVersionUID字段,它叫做什么,一般有什么用
6.什么是内存流?有什么作用