字符缓冲流
我们需要学习跟字符缓冲流相关的两个类,分别是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) | 创建一个使用给定大小的输出缓冲区的新缓冲字符输出流 |
字符缓冲流的练习
xxxxxxxxxx
package 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文件的练习
xxxxxxxxxx
package 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
字符缓冲流特有功能的练习
xxxxxxxxxx
package 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、释放资源
字符缓冲流复制文件_改进版的练习
xxxxxxxxxx
package 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();
}
}