今天学习了包装流,我们一起来看看,神魔叫做节点流和包装流
Java流的分类
按流向分:
输入流: 程序可以从中读取数据的流。
输出流: 程序能向其中写入数据的流。
按数据传输单位分:
字节流: 以字节为单位传输数据的流
字符流: 以字符为单位传输数据的流
按功能分:
节点流: 用于直接操作目标文件的流
过滤流: 是对一个已存在的流的链接和封装,通过对数据进行处理为程序提供功能强大、灵活的读写功能。
我们的节点流是真正的实现输入输出功能的流,我们的包装流是实现了对节点流的功能增强的功能,我们看一看到底有什么区别吧:
import java.io.*;
public class fileWriterTest {
public static void main(String[] args) {
FileReader fileReader=null;
BufferedReader bufferedReader = null;
try {
fileReader=new FileReader("test.txt");
bufferedReader = new BufferedReader(fileReader);
String str;
while((str=bufferedReader.readLine()) != null) {
System.out.print(str );
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
我们看一下上面的代码:
1.我们先创建了一个字符的文件读取流,读取test.txt文件中的内容,然后我们创建了一个带有缓冲的包装流bufferedReader,我们可以看到包装流的构造是以节点流为基础创建的,所以参数传入的是一个节点流对象,,然后我们读取文件中的内容
2.我们可以看到,这个缓冲性质的流不需要我们进行数组的创建,也就是我们不用像用节点流如FileInputStream那样需要创建byte数组来存储读取的内容,BufferedReader这个包装流已经为我们创建好了缓冲,我们可以直接读取,方法readLine一次可以读取一行的文本内容,但不读取文件中的换行符,也就是说我们的结果中的换行是println的换行而不是文件中的换行
文件test.txt内容
结果:
我们用print的时候
System.out.print(str );
我们用println的时候
System.out.println(str );
3.我们需要注意我们关闭流的时候,只需要对最外层的包装流进行关闭即可,其底层会自动对其所进行包装的节点流进行自动关闭。
我们从BufferedReader源代码可以看出
构造方法中传入的in对象就是需要进行包装的节点流
自动在包装流的关流中对节点流进行了关闭,我们不用再进行关闭了!!!