黑马程序员-IO(二)
装饰设计模式:
当想要对已有对象进行功能增强时。可以定义类,将已经有的类传入,基于已经有的功能,并且提供增强的功能,那么自定义的类就是装饰类。
- 两个基类:outputStream inputStream ;
- 缓冲区:Buffer+两个基类的名称
小技巧: 如何分辨字节流和字符流,就是字节流用byte[]操作, 字符流用char[] 操作
在字节流当中是对数据的最小操作,所以在写入操作的时候就不需要刷新操作。
【IO流的基本操作规律】
- 明确源和目的
- 源:输入流, inputstream ,Reader
- 目的:输出流 ,OutputStream , Writer
- 操作的数据是否是纯文本,
- 是:那么是字符流
- 不是:那么是字节流
- 当然字符流和字节流可以通过桥梁对象来引导
- 当体系明确以后,在明确是那个对象
- 我们可以通过设备来划分,
- 源:内存,键盘,硬盘
- 目的射门:内存,硬盘,控制台
使用缓冲区读写文件的思路:
- 1.通过两个基类。建立一个读写数据的流通道。因为我们在read(读取的时候是一个字节一个字节读取的可能有点慢,
- 建立一个缓冲区,通过底层流对象的rend()方法,把数据从硬盘一大批的存储在缓冲区当中,
- 接着就可以缓冲区读取读取数据了
- 写入数据就是读取数据的相反。
- 代码演示:
//文件读缓冲区 BufferedInputStream bufin = new BufferedInputStream(new FileInputStream("文件地址")); //文件写的缓冲区 BufferedOutputStream bufout = new BufferedOutputStream(new FileOutputStream("写到的文件地址")); byte [] buf = new byte[1024]; int len = 0; //读取到缓冲区当中,返回值为读取的长度,然后呢读取指针指向下一个地址,如果读取的结束了就返回 -1 , //所以这里我反复的读取 while ((len = bufin.read(buf))!=-1) { //写入数据,一直写,如果流还没有关闭的话。就一直在文本里面接着写入到后面的数据,设置len是保证他写入的长度; bufout.write(buf,0,len); } //不要忘记关闭流
bufin.close();
bufout.close();
读写文件
一个流被定义为一个数据序列。输入流用于从源读取数据,输出流用于向目标写数据。
下图是一个描述输入流和输出流的类层次图。
【读取键盘的录入】
system.out:标准输出流 –> 对应的是标准的输出设备:一般就是显示器
system.in: 标准的输入流->对应的一般就是输入设备
从控制台获取字符串的方法:
思路:
1.在我查看api文档的时候。查阅得控制太的输入是一个字节流。
2.既然是字节流。其实我们是可以用InputStream衍生出来的类。去读取的。但是就是麻烦。
3.所以我们可以把字节流引入到字符流对象当中,我们就可以用readnLine方法了。实现方式如下面
//创建键盘录入对象,键盘录入的是一个字节流。那么我们可以把他转换成为字符流, InputStream in = System.in; //创建一个字节流导向字符流的桥梁 InputStreamReader isReader = new InputStreamReader(in); //创建一个字流的缓冲区 BufferedReader buf = new BufferedReader(isReader); String line = null; while((line = buf.readLine())!=null) { if("over".equals(line)) { //如果用户输入的是的over那么结束录入功能。 break; } System.out.println(line); }