缓冲流
- 缓冲流:
- 字节缓冲流:
- 字符缓冲流:
- BufferedWriter:
- BufferedReader:
- 案例:
缓冲流:
缓冲流:对原始流进行包装,以提高原始流读写数据的性能。
字节缓冲流:
内存读写很快,文件读写很慢(减少读取磁盘的次数)
字节缓冲流:提高字节流读写数据的性能(读取磁盘的次数变少)。
原理:字节缓冲输入流自带了8KB缓冲池;字节缓冲输出流也自带了8KB缓冲池。
构造器 | 说明 |
---|---|
public BufferedInputStream(InputStream is) | 把低级的字节输入流包装成一个高级的缓冲字节输入流,从而提高读数据的性能 |
public BufferedOutputStream(OutputStream os) | 把低级的字节输出流包装成一个高级的缓冲字节输出流,从而提高写数据的性能 |
package com.itheima.demo00_3字节缓冲流;
import java.io.*;
public class Demo10 {
public static void main(String[] args) throws IOException {
// 创建字节缓冲输入流:
// BufferedInputStream(InputStream in): 对参数的流进行包装加强, 内部自带8192大小的数组, 真正操作文件靠参数的流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("day10\\abc\\3.txt"));
// 创建字节缓冲输出流:
// BufferedOutputStream(OutputStream out): 对参数的流进行包装加强, 内部自带8192大小的数组, 真正操作文件靠参数的流
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("day10\\abc\\333.txt"));
// 读写数据
int len=-1;
while((len=bis.read())!=-1){
bos.write(len);
}
//关闭资源
bos.close();
bis.close();
}
}
字符缓冲流:
BufferedWriter:
BufferedWriter:字符缓冲输出流。
作用:自带8K的字符缓冲池,可以提高字符输出流写字符数据的性能。
构造器 | 说明 |
---|---|
public BufferedWriter(Writer r) | 把低级的字符输出流包装成一个高级的缓冲字符输出流管道,从而提高字符输出流写数据的性能 |
方法 | 说明 |
---|---|
public void newLine() | 换行 |
BufferedReader:
BufferedReader:字符缓冲输入流。
作用:自带8K(8192)的字符缓冲池,可以提高字符输入流读取字符数据的性能。
构造器 | 说明 |
---|---|
public BufferedReader(Reader r) | 把低级的字符输入流包装成字符缓冲输入流管道,从而提高字符输入流读字符数据的性能 |
方法 | 说明 |
---|---|
public String readLine() | 读取一行数据返回,如果没有数据可读了,会返回null |
package com.itheima.demo01字符缓冲流;
import java.io.*;
public class Demo01 {
public static void main(String[] args) throws IOException {
test01();
test02();
}
public static void test02() throws IOException {
// 字符缓冲输入流, 新增的方法: String readLine(); 读取一行,没有数据返回null;
// BufferedReader(Reader in): 真正操作文件靠参数传入的流, BufferedReader提供8192大小的缓冲数组
// 读取文件:day10-io\abc\1.txt
BufferedReader br=new BufferedReader(new FileReader("day10\\abc\\1.txt"));
// 循环读取每一行数据
String row=null;
while((row=br.readLine())!=null){
System.out.println(row);
}
// 关闭资源
br.close();
}
public static void test01() throws IOException {
// 字符缓冲输出流, 新增的方法: void newLine(); 换行
// BufferedWriter(Writer out): 真正操作文件靠参数传入的流, BufferedWriter提供8192大小的缓冲数组
// 输出文件:day10-io\abc\1.txt
BufferedWriter bw=new BufferedWriter(new FileWriter("day10\\abc\\1.txt"));
// 输出第一行数据
bw.write("红烧茄子");
// 换行
bw.newLine();
// 输出第二行数据
bw.write("蒜香牛肉");
// 换行
bw.newLine();
// 输出第三行数据
bw.write("咸蛋黄茄子");
// 换行
bw.newLine();
//关闭资源
bw.close();
}
}
案例:
拷贝出师表到另一个文件,恢复顺序(进行安装编号排序)
package com.itheima.demo01字符缓冲流;
import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Test02 {
public static void main(String[] args) {
// 1.定义一个缓冲字符输入流管道与源文件接通:day10-io\abc\csb.txt
// 定义一个缓冲字符输出管道与目标文件接通:day10-io\abc\csb2.txt
try (BufferedReader br = new BufferedReader(new FileReader("day10\\abc\\csb.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("day10\\abc\\csb2.txt"));
) {
// 2.定义一个List集合存储读取的每行数据 List<String> list
List<String> list=new ArrayList<>();
// 3.定义一个循环按照行读取数据,存入到List集合中去
String row=null;
while((row=br.readLine())!=null){
list.add(row);
}
// 4.对List集合中的每行数据按照首字符编号升序排序
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
String s1 = o1.split("\\.")[0];
String s2 = o2.split("\\.")[0];
return Integer.compare(Integer.valueOf(s1),Integer.valueOf(s2));
}
});
// 6.遍历List集合中的每个元素,用缓冲输出管道写出并换行
for (String s : list) {
bw.write(s);
bw.newLine();
}
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}