字符缓冲流
我们需要学习跟字符缓冲流相关的两个类,分别是BufferedReader、BufferedWriter
BufferedReader类在java.io包下。该类的直接子类是LineNumberReader
BufferedReader类继承了Reader,BufferedReader的作用是从字符输入流读取文本,缓存字符,以提供字符,数组和行的高效读取
BufferedReader类可以指定缓冲区大小,或者使用默认大小。默认值足够大,可用于大多数用途
BufferedReader有两个构造方法,如下
| 字符缓冲输入流的构造方法 | 描述 |
|---|---|
| BufferedReader(Reader in) | 创建使用默认大小的输入缓冲区的缓冲字符输入流 |
| BufferedReader(Reader in, int sz) | 创建使用指定大小的输入缓冲区的缓冲字符输入流 |
BufferedWriter类在java.io包下。该类的所有实现接口为Closeable、Flushable、Appendable、AutoCloseable
BufferedWriter类继承了Writer,BufferedWriter的作用是将文本写入字符输出流,缓冲字符,以便有效地写入单个字符,数组和字符串
BufferedWriter类可以指定缓冲区大小,或者可以接受默认大小。 对于大多数用途,默认值足够大
BufferedWriter有两个构造方法,如下
| 字符缓冲输出流的构造方法 | 描述 |
|---|---|
| BufferedWriter(Writer out) | 创建使用默认大小的输出缓冲区的缓冲字符输出流 |
| BufferedWriter(Writer out, int sz) | 创建一个使用给定大小的输出缓冲区的新缓冲字符输出流 |
字符缓冲流的练习
xxxxxxxxxxpackage ch19;
import java.io.*;
//注意写数据的效果不是在控制台查看,需要去对应的文件。读数据直接在控制台就可以看到public class a_11_1测试 {
public static void main(String[] args) throws IOException {
//写数据用字符缓冲输出流的构造方法创建对象,BufferedWriter(Writer out) //上面的构造方法需要的参数是Writer,我们先创建一个Writer对象。报红线就选中它,按Alt+Enter,抛出异常 //FileWriter fw = new FileWriter("D:\\huanf\\java\\src\\ch18_ch19_储物区\\bw.txt"); //现在才是字符缓冲输出流对象 //BufferedWriter bw = new BufferedWriter(fw); //上面两行可以合并为一行,如下,想看源码可以选中下面那行的BufferedWriter,按Ctrl+B,就可以查看源码了 BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\huanf\\java\\src\\ch18_ch19_储物区\\bw.txt")); //写数据 bw.write("hello\r\n"); bw.write("world\r\n"); //释放资源 bw.close();
//-------------------------------------------------------------------------------------------------------------
//读数据用字符缓冲输入流的构造方法创建对象,BufferedReader(Reader in) //上面的构造方法需要的参数是Reader,我们先创建一个Reader对象。报红线就选中它,按Alt+Enter,抛出异常。下面的BufferedReader可查源码 BufferedReader br = new BufferedReader(new FileReader("D:\\huanf\\java\\src\\ch18_ch19_储物区\\bw.txt")); BufferedReader br2 = new BufferedReader(new FileReader("D:\\huanf\\java\\src\\ch18_ch19_储物区\\bw.txt")); //读数据有两种方式 //第一种方式,一次读取一个字符数据 int ch; while ((ch=br.read())!=-1){ System.out.print((char)ch);//注意是print不换行,输入跟写入的数据一样 } System.out.println("--------------------"); //第二种方式,一次读取一个字符数组数据 char[] chs = new char[1024]; int len; while ((len=br2.read(chs))!=-1){ System.out.print(new String(chs,0,len));//注意是print不换行,输入跟写入的数据一样 } //释放资源 br.close(); br2.close();
}}
字符缓冲流复制Java文件
案例:复制Java文件 需求:把"D:\huanf\java\src\ch18_ch19储物区\bw.txt"复制到"D:\huanf\java\src\ch18_ch19储物区\JavaSE"里面
思路: 1、根据数据源创建字符缓冲输入流对象 2、根据目的地创建字符缓冲输出流对象 3、读写数据,复制文件 4、释放资源
字符缓冲流复制Java文件的练习
xxxxxxxxxxpackage ch19;
import java.io.*;
public class a_12_1测试 {
//报红线就选中它,按Alt+Enter,抛出异常 public static void main(String[] args) throws IOException {
//1、根据数据源创建字符缓冲输入流对象 BufferedReader br = new BufferedReader(new FileReader("D:\\huanf\\java\\src\\ch18_ch19_储物区\\bw.txt"));
//2、根据目的地创建字符缓冲输出流对象 BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\huanf\\java\\src\\ch18_ch19_储物区\\JavaSE\\bw.txt"));
//3、读写数据,复制文件 //读数据有两种方式,只需要使用其中一种,另一种注释 //第一种方式,一次读一个字符数据 /*int ch; while ((ch= br.read())!=-1){ bw.write(ch); }*/
//第二种方式,一次读取一个字符数组数据 char[] chs = new char[1024]; int len; while ((len=br.read(chs))!=-1){ bw.write(chs,0,len); }
//释放资源 bw.close(); br.close();
}}
字符缓冲流特有功能
跟字符缓冲流相关的两个类,分别是BufferedReader、BufferedWriter
什么是行分隔符:例如\r、\r\n
BufferedWriter: 1、void newLine():写一行行分隔符,行分隔符字符串由系统属性定义
BufferedReader: 1、public String readLine():读一行文字。结果包含行的内容的字符串,不包括任何行终止字符,如果流的结尾已经到达,则为null
字符缓冲流特有功能的练习
xxxxxxxxxxpackage ch19;
import java.io.*;
public class a_13_1测试 {
public static void main(String[] args) throws IOException {
//写数据 //创建字符缓冲输出流。报红线就选中它,按Alt+Enter,抛出异常 BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\huanf\\java\\src\\ch18_ch19_储物区\\bw2.txt"));
//写数据 for(int i=0; i<10; i++){ //写入10次"hello" bw.write("hello" + i); //bw.write("\r\n");//每进循环写一次数据,就进行一次换行 //上面那行只适合windows系统,先注释了,所以这节课我们就使用字符缓冲流的特有功能来优化,如下 bw.newLine();//这行在写入上没有区别,但是这行可以适用任何系统的写入数据。newLine的作用是兼容各系统都可实现换行 }
//释放资源 bw.close();
//------------------------------------------------------------------------------------------------------------------
//读数据 //创建字符缓冲输入流对象 BufferedReader br = new BufferedReader(new FileReader("D:\\huanf\\java\\src\\ch18_ch19_储物区\\bw2.txt"));
//注意readLine方法一次只能读一行数据 //第一次读数据 String line = br.readLine(); System.out.println(line); //第二次读数据 line = br.readLine(); System.out.println(line); System.out.println("--------------------"); //如果把对应文件的数据读完了,就输出null
//使用循环改进上面的读数据,如下 String line2; while ((line2=br.readLine())!=null){ //因为上面已经读了两个数据,所以这里只会把后面3~9的数据全部读出来 //System.out.print(line2);//很奇怪为什么每个数据不换行,原因:readLine(),结果包含行的内容的字符串,不包括任何行终止字符 //如果需要换行的话,就自己手动写成println,如下 System.out.println(line2); }
//释放资源 br.close();
}}
字符缓冲流复制文件_改进版
使用字符缓冲流的特有功能来复制Java文件 需求:把"D:\huanf\java\src\ch18_ch19储物区\fos10.txt"复制到"D:\huanf\java\src\ch18_ch19储物区\JavaSE"里面
思路: 1、根据数据源创建字符缓冲输入流对象 2、根据目的地创建字符缓冲输出流对象 3、读写数据,复制文件。要求使用字符缓冲流的特有功能来实现 4、释放资源
字符缓冲流复制文件_改进版的练习
xxxxxxxxxxpackage ch19;
import java.io.*;
public class a_14_1测试 {
public static void main(String[] args) throws IOException {
//写数据 //创建字符缓冲输出流。报红线就选中它,按Alt+Enter,抛出异常 BufferedReader br = new BufferedReader(new FileReader("D:\\huanf\\java\\src\\ch18_ch19_储物区\\fos10.txt"));
//2、根据目的地创建字符缓冲输出流对象 BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\huanf\\java\\src\\ch18_ch19_储物区\\JavaSE\\fos10.txt"));
//3、读写数据,复制文件 //要求使用字符缓冲流的特有功能来实现,即让bw一次能读一行数据。即理解就是一次读一行字符串的数据 String line; while ((line=br.readLine())!=null){ bw.write(line);//里面只写这行的话,把对应文件复制过去后,会发现原数据都堆在一行。解决:自己再写一个换行,如下 bw.newLine(); }
//释放资源 bw.close(); br.close();
}}