1. 字符流
1.1 字符输入流Reader
Reader–抽象父类–不能实例化
FileReader–文件字符输入流-FR
BufferedReader–高效字符输入流-BR
FR in = new FR(new File(路径));
FR in = new FR(路径);
BR in = new BR(new FR(new File(路径)))
BR in = new BR(new FR(路径));
1.2 字符输出流Writer
Writer–抽象父类,不能实例化
FileWriter–文件字符输出流–FW
BufferedWriter–高效字符输出流–BW
FW out = new FW(File/File,append/String pathname/String pathname,append);
BW out = new BW(Writer–所以传的是子类FW(上面那4种));
注意:这里的append参数表示流向文件输出数据的时候是追加还是覆盖,如果不写,默认false是覆盖,如果改为true,表示追加
2. 缓冲流
2.1 缓冲流概述、字节缓冲流的使用
2.1.1 缓冲流概述
缓冲流也称为高效流、或者高级流。之前学习的字节流可以称为原始流。
作用:缓冲流自带缓冲区、可以提高原始字节流、字符流读写数据的性能
2.1.2 字节缓冲流性能优化原理:
字节缓冲输入流自带了8KB缓冲池,以后我们直接从缓冲池读取数据,所以性能较好。 字节缓冲输出流自带了8KB缓冲池,数据就直接写入到缓冲池中去,写数据性能极高了。
2.1.3 字节缓冲流
字节缓冲输入流:BufferedInputStream,提高字节输入流读取数据的性能。
字节缓冲输出流:BufferedOutputStream,提高字节输出流读取数据的性能。
2.1.4 缓冲流有几种?
字节缓冲流 字节缓冲输入流: BufferedInputStream
字节缓冲输出流:BufferedOutputStream
字符缓冲流 字符缓冲输入流:BufferedReader
字符缓冲输出流:BufferedWriter
2.1.5 字节缓冲流为什么提高了操作数据的性能?
字节缓冲流自带8KB缓冲区
可以提高原始字节流、字符流读写数据的性能
2.1.6 字节缓冲流的功能如何调用?
public BufferedOutputStream(OutputStream os)
public BufferedInputStream(InputStream is)
功能上并无很大变化,性能提升了。
2.2 字节缓冲流的性能分析
2.2.1 如何测试字节缓冲流的读写性能?
需求
分别使用低级字节流和高级字节缓冲流拷贝大视频,记录耗时。
分析
使用低级的字节流按照一个一个字节的形式复制文件。
使用低级的字节流按照一个一个字节数组的形式复制文件。
使用高级的缓冲字节流按照一个一个字节的形式复制文件。
使用高级的缓冲字节流按照一个一个字节数组的形式复制文件。
/**
* 使用高级的缓冲字节流按照一个一个字节数组的形式复制文件
*/
private static void copy(){
long startTime = System.currentTimeMillis();
try(
//这里只能放置资源对象,用完会自动关闭,自动调用资源对象的close方法关闭资源(即使出现异常也会做关闭操作)
//1.创建一个字节输入流管道与原图片接通
InputStream is =new FileInputStream(SRC_FILE);
//a.把原始的字节输入流包装成高级的缓冲字节输入流
InputStream bis =new BufferedInputStream(is);
//2.创建一个字节输出流`管道与目标图片接通
OutputStream os =new FileOutputStream(DEST_FILE+"video4.mp4");
//b.把字节输出流管道包装成高级的缓冲字节输出流管道
OutputStream bos =new BufferedOutputStream(os);
) {
//3.定义一个字节数组转移数据
byte[] buffer = new byte[1024];
int len;//记录每次读取的字节数
while ((len = bis.read(buffer)) != -1 ){
bos.write(buffer,0,len);
}
} catch (Exception e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
System.out.println("使用缓冲的字节流按照一个一个字节数组的形式复制文件耗时:"+(endTime - startTime)/1000.0+"s");
}
2.2.2 推荐使用哪种方式提高字节流读写数据的性能?
建议使用字节缓冲输入流、字节缓冲输出流,结合字节数组的方式,目前来看是性能最优的组合。
2.3 字符缓冲流
2.3.1 字符缓冲流为什么提高了操作数据的性能?
字符缓冲流自带8K缓冲区
可以提高原始字符流读写数据的性能
2.3.2 字符缓冲流的功能如何使用?
public BufferedReader(Reader r)
性能提升了,多了readLine()按照行读取的功能
public BufferedWriter(Writer w)
性能提升了,多了newLine()换行的功能
3. 转换流
3.1 不同编码读取乱码问题
3.1.1 之前我们使用字符流读取中文是否有乱码?
没有的,因为代码编码和文件编码都是UTF-8。
3.1.2 如果代码编码和文件编码不一致,使用字符流直接读取还能不乱码吗?
会乱码。
文件编码和读取的编码必须一致才不会乱码。
3.2 字符输入转换流
3.2.1 如果代码编码和文件编码不一致,使用字符流直接读取还能不乱码吗?
会乱码。
3.2.2 如何解决呢?
使用字符输入转换流
可以提取文件(GBK)的原始字节流,原始字节不会存在问题。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
KbI-1714169607445)]
[外链图片转存中…(img-lbyB6Nqs-1714169607445)]
[外链图片转存中…(img-Hxte99UQ-1714169607445)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新