带缓存的输入输出流(I/O)

news2024/11/27 18:28:33

文章目录

  • 前言
  • 一、带缓冲的输入输出流是什么?
  • 二、使用方法
    • 1.BufferedInputStream与BufferedOutputStream类
    • 2.BufferedReader与BufferedWriter类
  • 总结

前言

        输入输出流可以视为,从A点把货物搬运至B点。那么带缓冲的意思可以视为用货车把A点的货物搬运至B点。顾名思义,带有缓存的输入输出流运行效率更高。本篇文章讲述输入输出流更深一步的使用。


一、带缓存的输入输出流是什么?

        缓存是I/O的一种性能优化。缓存流为I/O流增加了内存缓存区,相当于运输货物过程中的货箱。有了缓存区(比喻,货箱),使得在流上执行skip()、mark()与reset()方法都可以使用。总而言之,这篇文章讲述,在输入输出流外部进行包装,带有缓存功能,提高IO流效率。(需要导入java.io包)

二、使用方法

1.BufferedInputStream与BufferedOutputStream类

构造方法:

new BufferedInputStream(InputStream in);
//将字节输入流包装成一个带有32个字节的缓存字节输入流

new BufferedInputStream(InputStream in,int size);
//将字节输入流包装成一个带有指定个数字节的缓存字节输入流

new BufferedOutputStream(OutputStream out);
//将字节输出流包装成一个带有32个字节的缓存字节输出流

new BufferedOutputStream(OutputStream out,int size);
//将字节输出流包装成一个带有指定个数字节的缓存字节输出流

实操展示:

项目:通过缓存字节输出流输入数据至文件中,再由缓存字节输入流读取出来。计时运行时间,比较一下带缓存和不带缓存的区别。

import java.io.*;
public class Demo {
    public static void main(String[] args) {
        File file = new File("show.txt");
        
        BufferedOutputStream outputStream2 = null;
        FileOutputStream outputStream = null;
        
        BufferedInputStream inputStream2 = null;
        FileInputStream inputStream = null;
        
        long startime = System.currentTimeMillis();
        try{
           
            outputStream = new FileOutputStream(file);
            outputStream2 = new BufferedOutputStream(outputStream);
            String str = "安得广厦千万间";
            byte b[] = str.getBytes();
            outputStream2.write(b);
            outputStream2.flush();  
//包装后需要每次写入都刷新一下,保证写入内容完整,装不满字节数是不会写入的,刷新直接将其写入

            byte b2[] = new byte[1024];
            inputStream = new FileInputStream(file);
            inputStream2 = new BufferedInputStream(inputStream);
            int len = inputStream2.read(b2);
            System.out.println("文件内容:"+new String(b2,0,len));
            while (inputStream.read(b2)!=-1);
            long endtime2 = System.currentTimeMillis();
            System.out.println("带缓存的字节输入流所耗时间为:"+(endtime2-startime));
            while (inputStream.read(b)!=-1);
            long endtime = System.currentTimeMillis();
            System.out.println("字节输入流所耗时间为:"+(endtime-startime));


        }catch(IOException e){
            e.printStackTrace();
        }finally{
            try {
                //先开启的流最后关闭,开关顺序为 123,321
                outputStream2.close();
                outputStream.close();
                inputStream2.close();   
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

BufferedOutputStream类缓冲输出字节流使用注意:

(1)在try代码块中实例化,括号引入FileOutputStream对象,进行包装,带入缓冲。

(2)在调用write()方法写入信息时,同时要调用flush()方法刷新,保证字符数据完整存入。

(3)最先开启的流,最后关闭。流的开关顺序为 123,321

BufferedInputStream类缓冲输入字节流使用注意:

(1)在try代码块中实例化,括号引入FileInputStream对象,进行包装,带入缓冲。

(2)最先开启的流,最后关闭。流的开关顺序为 123,321

 运行结果:

        如图所示,带有缓存的字节输入流读取信息的速度更快。无论是输入流还是输出流,带上缓存的目的都是为了提高运行效率。 

2.BufferedReader与BufferedWriter类

        BufferedReader类和BufferedWriter类分别继承了Reader类和Writer类,可以使用其基本方法的同时本施也增加了些方法。 

构造方法:

new BufferedWriter(FileWriter writer);
//将字符输入流包装成一个带有32个字节的缓存字符输入流

new BufferedReader(FileReader reader);
//将字符输出流包装成一个带有32个字节的缓存字符输出流

BufferedWriter类的常用方法
方法功能描述
write(String s,int off,int len)写入字符串s的某一部分(从off到len)
flush()刷新该流的缓存,缓存字符保存进文件中
newLine()写入一个行分隔符,换行

BufferedReader类的常用方法
方法功能描述
read()读取单个字符
readLine()读取一个文本行,并将其返回为字符串。若无数据返回null值。不断读取下一行,直到遇到文件末尾。

 实操展示:

import java.io.*;
public class Demo {
    public static void main(String[] args) {
        File file = new File("show.txt");
        
        BufferedWriter writer = null;
        FileWriter writer2 = null;

        BufferedReader reader = null;
        FileReader reader2 = null;

        try{
           
            writer2 = new FileWriter(file);
            writer = new BufferedWriter(writer2);
            String str1 = "长亭外,古道边,芳草碧连天。";
            String str2 = "晚风拂柳笛声残,夕阳山外山。";
            writer.write(str1);
            writer.newLine();   //换行输入内容
            writer.write(str2);
            writer.flush(); //刷新

            reader2 = new FileReader(file);
            reader = new BufferedReader(reader2);
      
            String tmp = null;
            int i = 1;  //计数器
            while ((tmp=reader.readLine())!= null) {
                //使用readLine()方法读取下一行信息,不需要引入参数保存数据。
                System.out.println("第"+i+"行的内容为:"+tmp);
                i++;
            }

        }catch(IOException e){
            e.printStackTrace();
        }finally{
            try {
                //先开启的流最后关闭,开关顺序为 123,321

                writer.close();
                writer2.close();

                reader.close();
                reader2.close();
              
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

BufferedWriter类缓冲输入字节流使用注意:

(1)在try代码块中实例化,括号引入FileInWriter对象,进行包装,带入缓冲。

(2)在调用write()方法写入信息时,同时要调用flush()方法刷新,保证字符数据完整存入。

(3)最先开启的流,最后关闭。流的开关顺序为 123,321

BufferedReader类缓冲输出字节流使用注意:

(1)在try代码块中实例化,括号引入FileOutputStream对象,进行包装,带入缓冲。

(2)最先开启的流,最后关闭。流的开关顺序为 123,321

运行结果:

文件输入内容 

 

 文件输出内容

        如图所示,字符输入输出流包装后,带入缓存。不仅能提升字符数据传输的效率,而且还能使用额外方便的方法,例如,readLine()、newLine等。 


总结

        以上就是带缓存的输入输出流,本文只是简单介绍了带缓存的输入输出流的使用,而输入输出流带上缓存既能提高运行速度,又有新的便利的方法可供使用。

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

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

相关文章

Chatgpt掘金之旅—有爱AI商业实战篇|品牌故事业务|(十六)

演示站点: https://ai.uaai.cn 对话模块 官方论坛: www.jingyuai.com 京娱AI 一、AI技术创业在品牌故事业务有哪些机会? 人工智能(AI)技术作为当今科技创新的前沿领域,为创业者提供了广阔的机会和挑战。随…

象棋教学辅助软件介绍

背景 各大象棋软件厂商都有丰富的题目提供训练,但是其AI辅助要么太弱,要么要付费解锁,非常不适合我们这些没有赞助的业余棋手自行训练,于是我需要对其进行视觉识别,和AI训练,通过开启这个辅助软件&#xf…

学习了解大模型的四大缺陷

由中国人工智能学会主办的第十三届吴文俊人工智能科学技术奖颁奖典礼暨2023中国人工智能产业年会于2024年4月14日闭幕。 会上,中国工程院院士、同济大学校长郑庆华认为,大模型已经成为当前人工智能的巅峰,大模型之所以强,是依托了…

【iOS开发】(二)react Native基础语法+样式+布局20240417

【IOS开发】 前言:(一)我们已经搭建好了基础环境,和iOS环境,并创建和在模拟器上成功运行了一个app,mywdm。 目录标题 一, 如何进行模拟器调试二,基础语法:1 掌握reactjs…

spring boot: 使用MyBatis从hive中读取数据

一、hive表&#xff1a; 启动hiveserver2 二、添加mybatis starter和hive依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instan…

微信小程序展示倒计时

html <view class"countdown"> <text>倒计时&#xff1a;</text> <text wx:for"{{countdown}}" wx:key"index">{{item}}</text> </view> ts data: {countdown: [], // 存放倒计时数组 targetTime:…

Table表格(关于个人介绍与图片)

展开行&#xff1a; <el-table :data"gainData" :border"gainParentBorder" style"width: 100%"><el-table-column type"expand"><template #default"props"><div m"4"><h3>工作经…

NVM下载、NVM配置、NVM常用命令

NVM(nodejs版本管理切换工具)下载、配置、常用命令 0、NVM常用命令 nvm off // 禁用node.js版本管理(不卸载任何东西) nvm on // 启用node.js版本管理 nvm install <version> // 安装node.js的命名 version是版本号 例…

谈谈我的实习生活

距离实习已经过去快一年了&#xff0c;说真的&#xff0c;很多关于实习的事情我都已经忘记了。今天正好我有空&#xff0c;就想着写一些东西&#xff0c;思来想去&#xff0c;就想着要不把实习的生活给记录下来&#xff0c;就当给自己留一个回忆&#xff0c;毕竟这也是我人生中…

春秋云境:CVE-2022-32991[漏洞复现]

从CVE官网查询该漏洞相关信息 该漏洞是由于welcome.php中的eid参数包含了SQL注入漏洞 则我们的目标就在于寻找welcome.php地址以及相关的可注入eid参数 开启靶机 先在页面正常注册、登录一个账号。密码随便填 进入了home目录&#xff0c;这里有三个话题可以选择开启 随便选…

AI大模型探索之路-应用篇15:GLM大模型-ChatGLM3-6B私有化本地部署

目录 前言 一、ChatGLM3-6B 简介说明 二、ChatGLM3-6B 资源评估 三、购买云服务器 四、git拉取GLM 五、pip安装依赖 六、运行测试 七、本地部署安装 总结 前言 ChatGLM3-6B 是 OpenAI 推出的一款强大的自然语言处理模型&#xff0c;它在前两代模型的基础上进行了优化和…

【数据工具】ArcGIS批量出图工具箱

工具下载链接&#xff1a;数据下载链接 我们在使用Arcgis制图的过程中&#xff0c;经常会遇到需要大量出图的情况&#xff0c;如何将做好的图批量导出jpg是一件令人头疼的问题。 今天小编就给大家分享俩个ArcGIS批量出图的工具箱&#xff0c;一个可以批量导出图层为jpg&#…

每日OJ题_完全背包④_力扣279. 完全平方数(一维和二维)

目录 力扣279. 完全平方数 问题解析 解析代码 优化代码&#xff08;相同子问题分析和滚动数组&#xff09; 力扣279. 完全平方数 279. 完全平方数 难度 中等 给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数&#xff0c;其值…

A Geolocation Databases Study(2011年)第一部分

下载地址:A Geolocation Databases Study | IEEE Journals & Magazine | IEEE Xplore 被引次数:195 Shavitt Y, Zilberman N. A geolocation databases study[J]. IEEE Journal on Selected Areas in Communications, 2011, 29(10): 2044-2056. Abstract 互联网IP地址的…

49.HarmonyOS鸿蒙系统 App(ArkUI)Tab导航组件的使用

HarmonyOS鸿蒙系统 App(ArkUI)Tab导航组件的使用 图片显示 Row() {Image($r(app.media.leaf)).height(100).width(100)Image($r(app.media.icon)).height(100).width(100) } 左侧导航 import prompt from ohos.prompt; import promptAction from ohos.promptAction; Entry C…

C语言通过键盘输入给结构体内嵌的结构体赋值——指针法

1 需求 以录入学生信息&#xff08;姓名、学号、性别、出生日期&#xff09;为例&#xff0c;首先通过键盘输入需要录入的学生的数量&#xff0c;再依次输入这些学生的信息&#xff0c;输入完成后输出所有信息。 2 代码 #include<stdio.h> #include<stdlib.h>//…

python使用redis存储时序数据

import redisdef ts_demo():"""时序数据存储RedisTimeSeries测试"""# 连接到Redisr redis.Redis(hostlocalhost, password"xxxx", port63790, db0)r1 r.ts()# print(r1.get("ts_key"))# print(r.exists(ts_key))# # 清空键…

Text2sql的一些技巧

最近看到了一篇关于text2sql的文章&#xff0c;以及一些论文。对使用模型做text2sql给了一些不错的建议。 参考文章&#xff1a;24年大模型潜力方向&#xff1a;大浪淘沙后的Text-to-SQL和Agent - 知乎 论文&#xff1a;https://arxiv.org/pdf/2403.09732.pdf 关于模型的建议 …

基于快照行情的股票/基金 1分钟 K 线合成指南

1. 概述 由于不同交易所不同资产的交易规则是有差异的&#xff0c;导致不同交易所基于快照行情或逐笔成交合成不同资产1分钟 K 线的计算方法是不同的。 本教程旨在提高 DolphinDB 在具体业务场景下的落地效率&#xff0c;降低 DolphinDB 在实际业务使用中的开发难度。 本教程…

飞行机器人专栏(十四)-- Kinect DK 人体骨骼点运动提取方法

系列文章目录 Ubuntu 18.04/20.04 CV环境配置&#xff08;下&#xff09;--手势识别TRTposeKinect DK人体骨骼识别_ubuntu kinect骨骼测试-CSDN博客文章浏览阅读1.3k次。trt_pose_ros kinect实现手势识别和人体骨骼识别&#xff0c;用于机器人运动控制参考_ubuntu kinect骨骼测…