JAVA-----IO篇四(缓冲流BufferedWriter以及BufferedReader、转换流outputStreamWriter以及inputStreamWriter)
程序员文章站
2022-06-09 21:10:39
...
JAVA-----IO篇四(缓冲流BufferedWriter以及BufferedReader)
使用BufferedWriter、BufferedReader能够自带缓冲,不需要指定char或者byte数组。
BufferedReader
buffer流的构造方法与其他的流不同,传入的参数是Reader对象,有两个构造方法:
BufferedReader(Reader in): 创建一个使用默认大小输入缓冲区的缓冲字符输入流。
BufferedReader(Reader in,int sz):创建一个使用指定大小输入缓冲区的缓冲字符输入流。
但是通过阅读源码可知,Reader是一个抽象类,抽象类不能实例化对象。
但是它有子类,FileReader,FileReader的父类是inputStreamReader,而inputStreamReader的父类时Reader。
因此在构造对应的buffer流对象时,需要传入对应流对象。
注意引入两个新的概念:包装流(也称处理流)、节点流,二者区分是相对而言。创建BufferedReader对象时需要引入Reader对象。
如果一个流的构造方法中需要传入流,那么这传入流称为“节点流”,此处的reader就是节点流。
外部负责包装的流,称为:包装流,也可以叫做处理流,bufferedReader就是包装流。
FileReader reader = new FileReader("F:\\a.txt");
BufferedReader bufferedReader = new BufferedReader(reader);
对于IO对象其实学习一个输入流、一个输出流就能够理解其他的输入输出流。不用再详细学习。
这里BufferedReader有一个特殊的方法,讲一下就OK,readerLine()读一行。
/**
* @author cz
* @date 2020/6/18/018
* 带有缓冲区的字符输入流
* 使用这个流的时候,不需要自定义char数组,或者说不需要自定义byte数组。自带缓冲
**/
public class BufferedReaderTest {
public static void main(String[] args) throws IOException {
String firstR = null;
String secondR = null;
// 如果一个流的构造方法中需要传入流,那么这传入流称为“节点流”,此处的reader就是节点流
// 外部负责包装的流,称为:包装流,也可以叫做处理流,bufferedReader就是包装流
FileReader reader = new FileReader("F:\\a.txt");
BufferedReader bufferedReader = new BufferedReader(reader);
// firstR = bufferedReader.readLine();
// secondR = bufferedReader.readLine(); // 当返回null时,证明该文件被读完
// System.out.println(secondR); //吼吼
// System.out.println(firstR); //哈哈哈黑黑
while ((firstR = bufferedReader.readLine())!=null){
System.out.println(firstR);
//会读一个文本行,不带换行符,也就是说如果用print,就会输出在同一行.哈哈哈黑黑吼吼
}
// 关闭流,只需要关闭最外层,里面的节点流不需要关闭,
// 在BufferedReader的源码中,能够发现,它的close方法,在关闭时,会自动关闭节点流对象。
// 对于包装流来说,只需要关闭外面的流即可,里面的节点流会自动关闭。
bufferedReader.close();
}
}
重点在buffer流,或者说是包装流的关闭,只需要关闭包装流即可,包装流的close方法会自动将节点流也关闭。以及buffer流的构造,还有使用时不需要指定byte或char数组。
根据构建方法中的Reader可知,buffer创建时只能够传入【字符流对象】,而不能传入【字节流对象】。
正好可以引入新的IO流对象学习:转换流outputStreamWriter、inputStreamWriter,作用就是将字节流转为字符流。
转换流:outputStreamWriter、inputStreamWriter
/**
* @author cz
* @date 2020/6/18/018
* 带有缓冲区的字符输入流
* 使用这个流的时候,不需要自定义char数组,或者说不需要自定义byte数组。自带缓冲
**/
public class BufferedReaderTest {
public static void main(String[] args) throws IOException {
// 字节流
FileInputStream in = new FileInputStream("F:\\a.txt");
// 该构造方法只能传递【字符流】,不能传递【字节流】
// 此时就需要转换流(将字节流转换为字符流) outputStreamWriter、inputStreamWriter
InputStreamReader inputStreamReader = new InputStreamReader(in);
// 该构造方法只能传递【字符流】,不能传递【字节流】
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
// 终极套娃,合并
// BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("F:\\a.txt")));
String s = null;
while ((s=bufferedReader.readLine())!=null){
System.out.println(s);
}
// 关闭时,关闭最外层
bufferedReader.close();
}
}
BufferedWriter
BufferedWriter和其他的输出流,在用法上没什么不同。同时也具有buffer流的特点。
/**
* @author cz
* @date 2020/6/18/018
* 带有缓冲区的字符输入流、字符输出流、
* 使用这个流的时候,不需要自定义char数组,或者说不需要自定义byte数组。自带缓冲
**/
public class BufferReaderTest {
public static void main(String[] args) throws IOException {
BufferedWriter writer = new BufferedWriter(new FileWriter("F:\\a.txt",true));
//或者
// BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("F:\\a.txt",true)));
writer.write("hello");
writer.write("\r\n"); //换行
writer.write("world");
writer.flush();
writer.close();
}
}
上一篇: Java过滤文件名