IO流概念

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(); 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值