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

本文详细介绍了Java中的各种I/O流,包括字符流Writer、BufferedStream(字节和字符缓冲流)、转换流处理编码问题以及对象序列化。通过性能分析和编码一致性讨论,帮助读者掌握高级I/O操作技巧。
摘要由CSDN通过智能技术生成

1.2 字符输出流Writer

2. 缓冲流

2.1 缓冲流概述、字节缓冲流的使用

2.2 字节缓冲流的性能分析

2.3 字符缓冲流

3. 转换流

3.1 不同编码读取乱码问题

3.2 字符输入转换流

3.3 字符输出转换流

4. 序列化对象

4.1 对象序列化

4.2 对象反序列化

5. 打印流

5.1 PrintStream、PrintWriter

5.2 输出语句的重定向

6. 补充知识: Proparties

6.1 Properties的作用

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)的原始字节流,原始字节不会存在问题。

img
img
img

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

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

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

KbI-1714169607445)]
[外链图片转存中…(img-lbyB6Nqs-1714169607445)]
[外链图片转存中…(img-Hxte99UQ-1714169607445)]

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

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

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

  • 29
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值