【Java基础】IO流(二)_printwriter自带多大缓冲区吗

7. 补充知识: IO框架

7.1 commons-io概述

7.2 FileUtils主要有如下方法

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.2.3 字符输入转换流InputStreamReader作用

可以解决字符流读取不同编码乱码的问题

public InputStreamReader(InputStream is,String charset):     可以指定编码把原始字节流转换成字符流,如此字符流中的字符不乱码。

3.3 字符输出转换流

3.3.1 如果需要控制写出去的字符使用的编码,怎么办?

可以把字符以指定编码获取字节后再使用字节输出流写出去:

“我爱你中国”.getBytes(编码)

也可以使用字符输出转换流实现。

3.3.2 字符输出转换流OutputStreamWriter的作用?

public OutputStreamWriter(OutputStream os,String charset)

可以指定编码把字节输出流转换成字符输出流,从而可以指定写出去的字符编码!

4. 序列化对象

4.1 对象序列化

4.1.1 对象序列化的含义是什么?

把对象数据存入到文件中去。

4.1.2 对象序列化用到了哪个流?

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

fcv-1714259042391)]
[外链图片转存中…(img-q4x5qFK0-1714259042392)]
[外链图片转存中…(img-aC4boaj6-1714259042392)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

  • 18
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值