3、高级流
高级流都是对基本流的包装,即高级流需要关联基本流
(1)缓冲流

---1、字节缓冲流
原理: 底层自带了长度为8192的缓冲区提高性能
字节缓冲流常用的方法
Public BufferedInputStream(InputStream is)把基本流包装成高级流,提高读取数据的性能
Public BufferedOutputStream(OutputStream os)把基本流包装成高级流,提高写出数据的性能
(1)练习:利用字节缓冲流拷贝文件
java
import java.io.*;
public class BufferedStreamDemo1 {
public static void main(String[] args) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("opp-IO\\a.txt"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("opp-IO\\c.txt"));
//一次读取一个字节
// int b;
// while ((b = bis.read()) != -1) {
// bos.write(b);
// }
//一次读取多个字节
int len;
byte[] bytes = new byte[1024];
while ((len = bis.read(bytes)) != -1) {
bos.write(bytes, 0, len);
}
bos.close();
bis.close();
}
}
(2)字节缓冲流提高效率的原理

---2、字符缓冲流
(1)字符缓冲流特有方法
原理: 底层自带了长度为8192的缓冲区提高性能( 注意: 字符流本身已经带有缓冲区了)
字符缓冲流构造方法
Public BufferedReader(Reader r) 把基本流变成高级流
Public BufferedWriter(Writer r) 把基本流变成高级流
字符缓冲流特有的方法
(1)字符缓冲输入流特有方法
Public ``String`` readLine() 读取一行数据(遇到\r\n才停止)如果没有数据可读了,会返回null
细节: readLine方法在读取数据的时候,一次读一行,遇到回车换行结束 但是它不会把回车换行读到内存当中(所以拷贝时,如果有换行,需调用newLine方法);
(2)字符缓冲输出流特有方法
Public void newLine() 跨平台的换行
注:该方法底层会自动判断是什么系统,对应不同的换行
这两个特有方法可以让读取拷贝的效率更高
java
import java.io.*;
public class BufferedStreamDem2 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("opp-IO\\a.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("opp-IO\\c.txt"));
/*读取数据
细:1:readLine方法在读取数据的时候,一次读一行,遇到回车换行结束
但是它不会把回车换行读到内存当中(所以拷贝时,如果有换行,需调用newLine方法);
细节2:该方法返回的是String,所以循环读取时,终止条件为null
*/
// String line1 = br.readLine();
// System.out.println(line1);
// String line2 = br.readLine();
// System.out.println(line2);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
bw.write(line);
bw.newLine();
}
bw.close();
br.close();
}
}
---3、缓冲流为什么能提高效率
-
缓冲流自带长度8192的缓冲区
-
可以显著提高字节流的读写性能
-
对于字符提升不明显,对于字符缓冲流而言关键点是两个特有的方法
---4、缓冲流的练习
(1)四种拷贝方式的效率对比
(2)控制软件运行次数
java
package BufferedStream;
import java.io.*;
public class Text {
public static void main(String[] args) throws IOException {
/*1.只开读,读取数据,因为输出流当开写时如果文件存在,则清空文件
而,此时要当你readLine读文件时,文件为空,会出现异常
规则:
IO流:什么时候用,什么时候创建,什么时候不用,什么时候关闭
*/
BufferedReader br = new BufferedReader(new FileReader("opp-IO\\a.txt"));
String line = br.readLine();
br.close();//读完立刻关闭读流!!
int count = Integer.parseInt(line);
count++;
if(count <= 3) {
System.out.println("欢迎使用本软件,第" + count + "次使用免费~");
}else {
System.out.println("本软件只能免费使用3次,欢迎注册会员后继续使用~");
}
//2.读完再开写,覆盖重写文件,不会提前清空
BufferedWriter bw = new BufferedWriter(new FileWriter("opp-IO\\a.txt"));
bw.write(count + "");
bw.close();
}
}
(2)转换流
