IO流:
IO:用于处理设备上的数据的技术。设备:内存,硬盘,光盘
流: 系统资源,windows系统本身就可以操作设备。各种语言只是使用系统平台上的这个资源。
并对外提供了各种语言自己的操作功能,这些功能最终调用的是系统资源。
使用完资源一定要记住:释放。
IO:java中所涉及的功能对象对存储在java.io包中
设备上数据最常见的存储表现形式文件file
File:IO技术用于操作设备上的数据,而数据最常见的体现方式是文件
文件的操作。
创建,删除,存在,隐藏,获取.....
需求:怎么操作文件的数据呢?
使用IO流对象。而且文件对象都是字节存在。
学习了可以操作文件的的字节流
InputStream
|--FileInputStream
OutputStrea
|--FileOutputStream
为了提高效率,引入缓冲区
InputStream
|--FileInputStream
|--FilterInpuStream
|--BufferedInputStream
OutputStream
|--FileOutputStream
|--FilterOutputStream
|--BufferedOutputStream
发现,文件数据,媒体文件字节流没问题
但是对于文本文件,想要操作文件中的中文数据时,字节流只能操作字节,需要我们字节解码成字符。麻烦。
所以就到API找对象,发现字符流中有字节和字符的桥梁,转换流。
Reader
|--InputStreamReader :字节-->字符
Writer
|--OutPutStreamWriter :字符-->字节
他们出现解决了中文的编码转换问题
为了便捷操作字符文件。找到了转换流的子类,但是它有局限性,只能操作文件,而且是默认编码。
如果不操作文件,而且编码不是默认的,需要使用转换流。
Reader
|--InputStreamReader :字节-->字符
|--FileReader
Writer
|--OutputStreamWriter :字符-->字节
|--FileWriter
为了提高字符流的操作效率,引入字符串的缓冲区
Reader
|--InputStreamReader :字节-->字符
|--FileReader
|--BufferedReader: readLine()
Writer
|--OutputStreamReader :字符-->字节
|--FileWriter
|--BufferedWriter: newLine()
!!! 4个File打头的,4个Buffer打头的,2个转换流
装饰设计模式: IO流里面的Buffer,就是装饰设计模式
可以给对象提供额外的功能(职责)。比继承这种方式更为灵活
装饰类与被装饰类都属于同一个体系。
同时装饰类中持有被装饰类的引用。
Properties
特点:
1.Hashtable的子类,map集合中的方法都可以用
2.该集合没有泛型。键值都是字符串
3.它是一个可以持久化的属性集,键值可以存储到集合中,也可以存储到持久化的设备上。
键值的来源也可以是持久化的设备。
=======================================================================
IO流的规律总结:解决的问题,就是开发中具体要使用哪个流对象的问题
1.明确数据源,数据汇(数据目的)
其实就是在明确要使用的IO体系。InputStream OutputStream Reader Writer
需求中操作的是源,意味着是读。
InputStream Reader
需求中操作的目的,意味着是写。
OutputStream Writer
2.操作的数据是否是纯文本数据
是,字符流
否,字节流
是并且是源,Reader
是并且也是目的,Writer
通前两个明确,明确了具体要使用的体系
接下来应该明确具体的体系中药使用哪个对象。
3.明确哟啊操作的具体设备,每个设备都有对应的流对象。
源设备:
硬盘,能操作File的流对象都是。File开头
键盘,System.in
内存,数组
网络,socket流
目的设备:
硬盘,能操作File的流对象都是。File开头
显示器,System.out
内存,数组
网络,socket流
到第三步明确就可以找到具体的流对象了。
4.需要额外功能吗?
需要高效吗?缓冲区,Buffered开头。
需要编码转换吗?转换流。
===============================================================
需求1:通过键盘录入数据,将数据保存到一个文件中。
明确一:有源吗?有,有目的吗?有。
源:InputStream Reader
目的:OutputStream Writer
明确二:是纯文本数据吗?是。
源:Reader
目的:Writer
明确三:具体设备
源设备:System.in
目的设备:硬盘
InputStream is = System.in;
FileWriter fw = new FileWriter("a.txt");
//将读取的字节存储到数组read(byte[])
//将字节数组转成字符串。
//通过fw.write(String)写入到文件中。
//但是麻烦,因为明确源是Reader,需要将字节流转成字符流,这样操作文字就便捷了
明确四:需要功能吗?
需要,转换。字节-->字符。InputStreamReader
InputStreamReader isr = new InputStreamReader(System.in);
FileWriter fw = new FileWriter("a.txt");
//一次读取一个字符
//将读到的字符写入
//当也可以定义字符数组缓冲区
需要其它功能吗?
需要,高效,Buffered
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new FileWriter("a.txt"));
//line = readLine();
//bufw.write(String);bufw.flush();
需求2:读取文本文件中的数据,将其打印到控制台上
明确一:有源吗?有,有目的吗?有。
源:InputStream Reader
目的:OutputStream Writer
明确二:是纯文本
源:Reader
目的:Writer
明确三:明确设备。
源设备:
硬盘:FileXXX
目的设备:
显示器:System.out
FileReader fr = new FileReader("a.txt");
OutputStream(PrintStream) out System.out;
//fr读取数据到数组中。
//使用PrintStream直接调用println方法就可以打印了。如果使用OutputStrem可以调用writer方法就可以将数据写入到显示器上
//麻烦。
//因为源都是字符数据,可以通过字符流操作,将字符转成字节在给显示器
需要额外功能吗?
需要转换字符-->字节
FileReader fr = new FileReader("a.txt");
OutputStreamWriter osw = new OutputStreamWriter(System.out)
//还需要额外功能吗?
需要高效。
BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
//读取一行数据
//写入一行数据
==========================================================================
IO包中的其他功能流对象
功能对象
特点:解决的问题,特有方法
打印流--输出流
PrintStream(字节流)PrintWriter(字符流)
特点:打印,不抛异常
打印的目的:File对象,字符串路径,字节输出流
解决问题:方法的打印各种数据值表现形式
它的打印方法可以保证数值的表现形式不变。写的是什么样子,目的就是什么
PrintWriter:一样具备打印功能
目的:File对象,字符串路径,字节输出流,字符输出流
--------
序列流:
特点:流对象的有序的排列
解决问题:将多个输入流合并成一个输入流。将多个源合并成一个源。对于多个源的操作会变得简单
功能:特殊之处在构造函数上。一初始化就合并了多个流进来
使用场景之一:对多个文件进行数据的合并,多个源对应一个目的。
--------
用于操作对象的流对象。对象的序列化。
ObjectInputStream ObjectOutputStream
特点:用于操作对象
解决问题:可以将对象进行序列化和反序列化。注意:对象序列化一定要实现Serializable接口。为了给类定义一个serial VersionUID
功能:ObjectInputStream readObject() ObjectOutputStream writeObject()
关键字:瞬态:transient
--------
RandomAccessFile:
特点:只能操作文件
既能读又能写
维护了一个byte数组。内部定义了字节流
通过对指针的操作可以实现对文件的任意位置的读取和写入
功能:getFilePointer seek用于操作文件指针的方法
--------
管道流。
特点:读取管道和写入管道可以链接
需要使用多线程技术。单线程容易死锁
功能:connect();