重学java 65.IO流 缓冲流

news2024/11/19 16:33:49

I am not afraid tomorrow

for I have seen yesterday

and love today

                        —— 24.6.5

一、字节缓冲流

1.字节缓冲流的意义

        之前所写的FileOutputstream、FileInputstream、FileReader、Filewriter这都叫做基本流,其中FileInputstream和FieOutputstream的读写方法都是本地方法(方法声明上带native),本地方法是和系统以及硬盘打交道的,也就是说这两个对象的读和写都是在硬盘之间进行读写的,效率不高;

        缓冲流中底层带一个长度为8192的数组(缓冲区),此时读和写都是在内存中完成的(在缓冲区之间完成),内存中的读写效率非常高

        使用之前需要将基本流包装成缓冲流,其实就new对象时,传递基本流

2.字节缓冲流

a、BufferedOutputStream:字节缓冲输出流

        构造:BufferedOutputStream(OutputStream out)

        使用:和FileOutputStream一样

b、BufferedIntputStream:字节缓冲输入流

        构造:BufferedInputStream(InputStream in)

        使用:和FileInputStream一样

3.示例

import java.io.*;

public class Demo274BufferedInOutputStream {
    public static void main(String[] args) throws Exception {
        // 基本流
        method01();
        
        // 缓冲流
        method02();
    }

    // 使用字节缓冲流复制文件
    private static void method02() throws Exception {
        long start = System.currentTimeMillis();
        FileInputStream fis = new FileInputStream("D:\\2LFE\\Desktop\\前端三剑客\\html\\HTML_day01\\我始终相信.jpg");
        FileOutputStream fos = new FileOutputStream("AllWillBest_Java/src/S96IOBuffered/我始终相信.jpg");


        BufferedInputStream bis = new BufferedInputStream(fis);
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        // 边读边写
        int len;
        while((len = bis.read())!=-1){
            bos.write(len);
        }
        long end = System.currentTimeMillis();
        System.out.println("字节缓冲流:"+(end - start));
        bos.close();
        bis.close();
    }

    // 用基本流复制文件
    public static void method01() throws IOException {
        long start = System.currentTimeMillis();
        FileInputStream fis = new FileInputStream("D:\\2LFE\\Desktop\\前端三剑客\\html\\HTML_day01\\我始终相信.jpg");
        FileOutputStream fos = new FileOutputStream("AllWillBest_Java/src/S96IOBuffered/我始终相信.jpg");
        // 边读边写
        int len;
        while((len = fis.read())!=-1){
            fos.write(len);
        }
        long end = System.currentTimeMillis();
        System.out.println("基本流:"+(end - start));
        fos.close();
        fis.close();
    }
}

4.问题

        问题1:使用缓冲流的时候,为啥只需要关闭缓冲流,不用单独关闭基本流呢?

                原因:缓冲流的close方法底层会自动关闭基本流1

        问题2:缓冲流底层有数组(缓冲区),都是在内存之间进行读写,那么缓冲流读写的过程是啥样的呢

                注意:先依靠基本流将数据读出来,交给缓冲流,由于缓冲流缓冲区是8192,所以每次读取8192个字节放到缓冲区中,然后再将输入流缓冲区中的数据交给输出流缓冲区,然后再利用基本流将数据写到硬盘上

        那么在操作代码时,len是干嘛的呢?

                主要是在两个缓冲区中倒腾数据,将输入流缓冲区中的数据读到,然后写到输出流缓冲区中,等待输出流缓冲区满了,在依靠基本流写到硬盘上,如果输入流缓冲区的数据读不到了,那么重新从硬盘上读8192个字节进入到输入流缓冲区中

二、字符缓冲流

1.字符缓冲输出流 BufferedWriter

        构造:Bufferedwriter(writer w)

        方法:用起来和Filewriter一样

        特有方法:newLine()换行

import java.io.BufferedWriter;
import java.io.FileWriter;

public class Demo275BufferedWriter {
    public static void main(String[] args) throws Exception {
        BufferedWriter bw = new BufferedWriter(new FileWriter("AllWillBest_Java/4.txt", true));
        bw.write("一切都会好的");
        bw.newLine();
        bw.write("我一直相信");
        bw.newLine();
        bw.write("苦难是花开的伏笔");
        bw.close();
    }
}

2.字符缓冲输入流 BufferedReader

        构造:BufferedReader(Readerr)

        方法:用法和FileReader一样

        特有方法:String readLine() —> 一次读一行,如果读到结束标记,返回的是null

3.示例

import java.io.BufferedReader;
import java.io.FileReader;

public class Demo276BufferedReader {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new FileReader("AllWillBest_Java/4.txt"));
        String s = null;
        while((s = br.readLine()) != null) {
            System.out.println(s);
        }
        br.close();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1791761.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解锁ArrayBlockingQueue奥秘:深入源码的精彩之旅

1.简介 ArrayBlockingQueue 是 BlockingQueue 接口的一个实现类,它基于数组实现了一个有界阻塞队列。创建 ArrayBlockingQueue 实例时需要指定队列的容量,队列的大小是固定的,无法动态增长。 主要特点包括: 有界性:A…

AI大模型+产品经理:打造智能产品的黄金组合

前言 当我们谈论AI大模型与产品经理的结合,不仅仅是技术与创意的碰撞,更是对未来智能生活的期待。想象一下,当产品的灵魂被注入智能的血液,它们将成为我们生活中不可或缺的伙伴。 我们不仅仅是要探索AI大模型的深层技术&#xf…

泛微开发修炼之旅--07通过后端代码实现创建并发送待办、源码及示例

文章链接:泛微开发修炼之旅--07通过后端代码实现创建并发送待办、源码及示例

云原生架构案例分析_5.某体育用品公司云原生架构的业务中台构建

1.背景和挑战 某体育用品公司作为中国领先的体育用品企业之一,在2016年,某体育用品公司启动集团第三次战略升级,打造以消费者体验为核心的“3”(“互联网”、“体育”和“产品”)的战略目标,积极拥抱云计算…

告别拥堵:SpringBoot+消息队列打造你的专属交通指挥家!

随着5G和物联网技术的飞速发展,系统的智能化已成为不可逆转的趋势。带你一窥未来,探索如何通过SpringBoot和消息队列技术的结合,开启智能系统的新纪元。从事件驱动架构的实现,到异步消息处理的最佳实践,再到集成主流消…

iOS——类与对象底层探索

类和对象的本质 当我们使用OC创建一个testClass类并在main函数创建它的实例对象的时候,OC的底层到底是什么样的呢? 首先,我们要了解OC对象的底层结构,那么我们就得知道:OC本质底层实现转化其实都是C/C代码。 使用下面…

【scikit-learn010】sklearn算法模型清单实战及经验总结(已更新)

1.一直以来想写下基于scikit-learn训练AI算法的系列文章,作为较火的机器学习框架,也是日常项目开发中常用的一款工具,最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下scikit-learn框架模型算法包相关技术点及经验。 3.欢迎批评指正,欢迎互三,跪谢一键…

【重磅丨教育设备】推动大规模设备更新和消费品以旧换新行动方案

近日,国务院印发《推动大规模设备更新和消费品以旧换新行动方案》(以下简称《行动方案》)。《行动方案》提出:实施设备更新行动。提升教育文旅医疗设备水平,推动符合条件的高校、职业院校(含技工院校&#…

数据资产入表-数据治理-标签设计标准

前情提要:数据价值管理是指通过一系列管理策略和技术手段,帮助企业把庞大的、无序的、低价值的数据资源转变为高价值密度的数据资产的过程,即数据治理和价值变现。上一讲介绍了数据清洗标准设计的基本逻辑和思路。 上一讲介绍了其他的通用标…

JVM类加载机制详解(JDK源码级别)

提示:从JDK源码级别彻底剖析JVM类加载机制、双亲委派机制、全盘负责委托机制、打破双亲委派机制的程序、Tomcat打破双亲委派机制、tomcat自定义类加载器详解、tomcat的几个主要类加载器、手写tomcat类加载器 文章目录 前言一、loadClass的类加载大概有如下步骤二、j…

centos8stream 编译安装 php-rabbit-mq模块

官方GitHub:https://github.com/php-amqp/php-amqp 环境依赖安装 dnf install cmake make -y 1.安装rabbitmq-c cd /usr/local/src/ wget https://github.com/alanxz/rabbitmq-c/archive/refs/tags/v0.14.0.tar.gz tar xvf v0.14.0.tar.gz cd rabbitmq-c-0.14.0/…

MYSQL数据库细节详细分析

MYSQL数据库的数据类型(一般只需要用到这些) 整型类型:用于存储整数值,可以选择不同的大小范围来适应特定的整数值。 TINYINTSMALLINTMEDIUMINTINTBIGINT 浮点型类型:用于存储带有小数部分的数值,提供了单精度(FLOA…

调用上传文件接口出现格式错误

一、造成这种错误的可能有很多 1.检查一下传递格式 2.检查一下接口要求的格式 二、举个例子 这两个有什么区别? 那就是json、和form-data,一定要看仔细接口 如果还是按照json的方式去传就会报错 三、更改header里Content-Type的类型 json等的heade…

iOS18 新变化提前了解,除了AI还有这些变化

iOS 18即将在不久的将来与广大iPhone用户见面,这次更新被普遍认为是苹果历史上最重要的软件更新之一。据多方报道和泄露的消息,iOS 18将带来一系列全新的功能和改进,包括在人工智能领域的重大突破、全新的设计元素以及增强的性能和安全性。现…

【成都信息工程大学】只考程序设计!成都信息工程大学计算机考研考情分析!

成都信息工程大学(Chengdu University of Information Technology),简称“成信大”,由中国气象局和四川省人民政府共建,入选中国首批“卓越工程师教育培养计划”、“2011计划”、“中西部高校基础能力建设工程”、四川…

SASAM软件架构静态分析法-系统架构师(六)

1、体系结构权衡分析法(Architecture Tradeoff Analysis Method ATAM)包含四个主要活动领域,分别是 场景和需求的收集、体系结构视图和场景的实现、()、折中。基于场景的架构分析方法(Scenarios-based Arch…

React常见的一些坑

文章目录 两个基础知识1. react的更新问题, react更新会重新执行react函数组件方法本身,并且子组件也会一起更新2. useCallback和useMemo滥用useCallback和useMemo要解决什么3. react的state有个经典的闭包,导致拿不到最新数据的问题.常见于useEffect, useMemo, useCallback4. …

Crosslink-NX器件应用连载(11): 图像(数据)远程传输

作者:Hello,Panda 大家下午好,晚上好。这里分享一个Lattice Crosslink-NX器件实现图像或数据(卫星数据、雷达数据、ToF传感器数据等)远程传输的案例(因为所描述的内容颇杂,晒图不好晒&#xff…

618数码好物推荐!精选便宜又实用的数码产品推荐!

着618购物盛宴的脚步日益临近,你是否已经锁定了心仪的宝贝?那些曾让你心动不已的数码产品,现在正是以最低价收入囊中的绝佳时机。618不仅是一场购物狂欢,更是各大电商平台竞相推出优惠政策的盛宴。为了满足大家的需求,…

C语言笔记第13篇:自定义类型(联合union和枚举enum)

1、联合体 1.1 联合体类型的声明 像结构体一样,联合体也是由一个或多个成员构成,这些成员可以是不同的类型。 但是编译器只为最大的成员分配足够的内存空间,联合体的特点是所有成员共用一块内存空间,所以联合体也叫&#xff1a…