重学java 65.IO流 缓冲流

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.mzph.cn/bicheng/23203.shtml

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

相关文章

局域网怎么设置路由器?

在搭建局域网的过程中,设置路由器是非常重要的一步。正确地设置路由器可以确保局域网的正常运行,并且可以更好地保护网络安全。以下是一些关于如何设置路由器的指南。 第一步:获取路由器 您需要获得一台适合您需求的路由器设备。选择一款性能…

idea如何根据路径快速在项目中快速打卡该页面

在idea项目中使用快捷键shift根据路径快速找到该文件并打卡 双击shift(连续按两下shift) -粘贴文件路径-鼠标左键点击选中跳转的路径 自动进入该路径页面 例如:我的实例路径为src/views/user/govType.vue 输入src/views/user/govType或加vue后缀src/views/user/go…

回炉重造java----JUC(第二天)

Monitor---监视器/管程 对象头: 操作系统提供的Monitor对象 Synchronized底层实现原理: ①锁对象在加了synchronized之后,对象头中的Mark Word中就存了一个Monitor的地址指针。 ②当一个线程获取到锁之后,Monitor中的Owner属性指…

Leetcode3168. 候诊室中的最少椅子数

Every day a Leetcode 题目来源:3168. 候诊室中的最少椅子数 解法1:模拟 代码: /** lc appleetcode.cn id3168 langcpp** [3168] 候诊室中的最少椅子数*/// lc codestart class Solution { public:int minimumChairs(string s){int chair…

【踩坑记录】Elasticsearch查询:circuit_breaking_exception异常解决方案

项目场景: springboot中使用ES7查询一个月内的数据量趋势时出错。在开发线上正常,演示线时出现异常 问题描述 项目在演示线环境的时候,出现查询异常 异常信息如下: org.elasticsearch.ElasticsearchStatusException: Elastics…

Web3设计风格和APP设计风格

Web3设计风格和传统APP设计风格在视觉和交互设计上有一些显著的区别。这些差异主要源于Web3技术和理念的独特性,以及它们在用户体验和界面设计中的具体应用。以下是Web3设计风格与传统APP设计风格的主要区别。北京木奇移动技术有限公司,专业的软件外包开…

Android 13 亮度调节代码分析

frameworks\base\packages\SystemUI\res\layout\quick_settings_brightness_dialog.xml 进度条控件 <com.android.systemui.settings.brightness.BrightnessSliderViewxmlns:android"http://schemas.android.com/apk/res/android"android:id"id/brightness…

【PL理论】(5) F#:递归类型 | Immutability 特性(F#中值一旦定义就不会改变)

&#x1f4ad; 写在前面&#xff1a;本文旨在探讨不可变数据结构在 F# 编程中的应用&#xff0c;特别是如何利用递归记录类型来表示和操作数值表达式。通过定义存储整数的二叉树和数值表达式的类型&#xff0c;我们将展示不可变性如何简化程序的理解和维护。文章将对比 F# 与命…

Android音频API介绍

Android系统提供了四个层面的音频API&#xff1a; Java层MediaRecorder&MediaPlayer系列&#xff1b;Java层AudioTrack&AudioRecorder系列&#xff1b;Jni层opensles&#xff1b;JNI层AAudio&#xff08;Android O引入&#xff09; 下面分别介绍这些API的使用及特点。…

opencv用自适应直方图均衡化函数cv2.createCLAHE()提高对比度

来自WeTab AI Pro cv2.createCLAHE() 是 OpenCV 中的一个函数&#xff0c;用于创建 CLAHE&#xff08;Contrast Limited Adaptive Histogram Equalization&#xff0c;对比度受限自适应直方图均衡化&#xff09;对象。CLAHE 是一种增强图像局部对比度的技术&#xff0c;通过限…

@EnableWebSecurity 注解的用途及适用场景

在 Spring Security 框架中&#xff0c;EnableWebSecurity 注解是一个重要的功能&#xff0c;用于启用 Spring Security 的 Web 安全功能。它为 Spring MVC 应用程序提供了一系列的安全特性&#xff0c;如登录、权限验证、会话管理、密码加密等。 以下是一些使用 EnableWebSec…

Vulnhub-DC-2

靶机IP:192.168.20.135 网络有问题的可以看下搭建Vulnhub靶机网络问题(获取不到IP) kaliIP:192.168.20.128 扫描靶机端口及服务版本 发现开放了80和7744端口 并且是wordpress建站 dirsearch扫描目录 访问前端界面&#xff0c;发现存在重定向 在hosts文件中增加192.168.2…

HandyControl的属性编辑器如何绑定自定义控件,并集成到自定义编辑器

第一步&#xff1a;自定义控件的TypeDescription描述。 为了扩展.NET的类型描述系统(Type Descriptor System)&#xff0c;在运行时动态地更改对象的属性&#xff0c;使得这些属性在PropertyGrid上下文中不会被显示。 1.CLTypeDescriptionProvider&#xff1a;这是一个TypeDesc…

【第5章】SpringBoot实战篇之登录模式切换

文章目录 前言一、接口扩展1. LoginStorage2. LocalLoginStorage3. RedisLoginStorage4. 参数配置 二、登录相关接口改动1.登录接口2. 登录拦截器 总结 前言 前面分别介绍了本地Map和redis存储用户登录信息&#xff0c;但是第二天我登录就出现问题了&#xff0c;因为我Redis部…

QT4-QT5升级(3)GBK-UTF-8-乱码“常量中有换行符”

乱码有两种&#xff1a;我命名为汉字乱码菱形乱码如下&#xff1a; 1.文件编码为&#xff1a; GB2312 打开编码&#xff1a; GB2312 编译后&#xff1a; QString 部分字符串 常量中有换行符 char * …

论文阅读- CycleFormer : TSP Solver Based on Language Modeling

Q: 这篇论文试图解决什么问题&#xff1f; A: 这篇论文提出了一个新的基于Transformer模型的旅行商问题&#xff08;Traveling Salesman Problem, TSP&#xff09;求解器&#xff0c;称为CycleFormer。它旨在解决传统Transformer模型在应用于TSP时面临的一些挑战和局限性&…

JavaScript 函数调用

JavaScript 函数调用 函数是 JavaScript 编程语言的核心组成部分&#xff0c;它们允许开发者将代码组织成可重用的块。在 JavaScript 中&#xff0c;函数调用是执行函数代码的方式。本文将深入探讨 JavaScript 中的函数调用&#xff0c;包括基本语法、不同类型的函数调用方式&…

RocketMq源码解析五:生产者Producer发送消息

上一章我们把生产者启动的流程和大家一起跟着源码走了一遍,现在我们来看发送消息的流程。上一章我们已经把核心接口和类关系梳理了一遍。如下图 我们今天重点看MQProducer中的send方法最终的实现。DefaultMQProducer中,send的实现最终还是调用了 defaultMQProducerIm…

有问有答—JavaSE—反射应用

写一个函数&#xff0c;传入任意的对象&#xff0c;可以将对象里面String类型的属性中的a改成b。 field.getClass() private void changeField(Object object) throws IllegalAccessException {//1.获得对应的字节码Class clazz object.getClass();//对象.getClass。 类.cla…

Openfeign远程调用

在实际开发中&#xff0c;Openfeign远程调用要避免在循环中使用&#xff0c;这个是比较耗时的。如使用不当可能会把远程服务压垮。正确的用法是在循环外一次查询获得条件的Map集合&#xff0c;然后在循环里边通过给map传入key&#xff0c;从而获得map对应的值&#xff0c;从而避…