黑马程序员-IO流

  • ------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
  • 分类

  1. 按目的分为输出流和输入流,我自己更爱称为读取流和写入流。
  1. 按数据传输类型分为字节流和字符类。ps:对于纯文本数据,字符流效率更高,但是只能处理文本数据,而字节流是可以应用任何数据,mp3,jpg,mp4,字符流其本身也是字节流。
  1. io流一共四个抽象基类,字节流:InputStream,OutputStream  ;字符流:Reader,Writer

  • 基本方法
字节流 :InoutStream:

read 读取一个字节,返回的是整数,返回-1代表读取到结尾
fluse 刷新此流
close 关闭此流
字节流:OutputStream
write 打印一个字节
fluse 刷新此流
close 关闭此流
字符流:Reader
readLine 读取一行字符数据 返回是整数,-1代表读到结尾
read 读取一个字符数据 返回是整数,-1代表读到结尾
字符流:Writer

write(int c) throws IOException 向输出流写入一个字符

     write(String str) throws IOException将一个字符串中的字符写入到输出流

     write(String str,int offset,int length)

  • 缓冲区:BufferedReader BufferedWrietr BufferedInputStream BufferedOutputStream

就是给4个基本流 加上一个缓冲区,优化性能,创建缓冲流的时候要传入一个基本流对象,底层原理就是将流对象读取(存储)到的数据先封装到一个容器里,StringBuilder,等读到一行的标记结尾的符号时候在读取(存储)到目的,优化了性能,增加了流对象的健壮性,所以缓冲流这种模式,叫做装饰设计模式。

  • 什么时候选择缓冲流呢?,选择流对象的时候要选择字符流还是字节流?

如:将一个文本文件数据存储到另一个文件中,也就是复制文件

先明确源:是操作一个文本文件,所以选择Reader

明确流体系中的哪个对象:读取的是硬盘上的数据,所以是FileReader

要提高效率:使用BufferedReader 

代码就是这样:BufferReader bufr = new BufferedReader(new FileReader("a.txt"));

明确目的:是输入,并且操作一个文本数据,所以是Writer

明确Writer体系中哪个对象:文本文件,FileWriter

提高效率:BufferedWriter

代码生成:BufferedWriter bufw = new BufferedWriter(new FileWriter(b.txt));

  • 转换流:

也就是说可以把字节流转换成字符流,可以用在键盘录入上,因为键盘录入是字节流,所以如果要提高下性能那么就可以转换成字符缓冲流

BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));

转换流也可以指定编码表:

BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("1.txt"),"utf-8"));

  • 上面说到了装饰设计模式那么下面写一下:

当想要对已有的对象进行功能争强时,可以自定义类,将已有的对象传入,基于已有的功能,并且提供及加强的功能,那么自定义的类被称为装饰类,装饰类通常会通过构造方法接受被装饰的对象,并且基于被装饰对象的功能,提供更牛逼的功能。

装饰设计模式比继承要灵活,避免了继承体系的臃肿,而且降低了类和类之间的关系。

装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强的功能,所以装饰类和被装饰类通常都是属于一个体系中的。

  • IO包中的其他流:

  • 打印流:PrintWriter是字符输出流,PrintStream是字节输出流,好处就是简化了书写,可以直接操作输出流文件,如果要操作纯文本文件那么选择PrintWriter。

PrintWriter pw = new PrintWriter("1.txt", "true");在创建对象的时候传入true,就可以指定自动刷新并且里面提供了一个自动换行的方法,println();可以在输出完一行之后自动换行。

  • 管道流:

PipedInputStream

PipedOutputStream

特点:读取管道流流和写入管道流可以进行连接。

         连接方式:1.通过两个流对象的构造函数。

                   2.通过两个对象的connect方法。

       注意;对于read方法。该方法是阻塞式的,也就是没有数据的情况,该方法会等待。

  • 序列流,SequenceInputStream:

 特点:可以将多个读取流合并成一个流。这样操作起来很方便。

     原理:其实就是将每一个读取流对象存储到一个集合中。最后一个流对象结尾作为这个流的结尾。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值