内存中的缓存区
在 Java 的 I/O 流设计中,BufferedInputStream 和 BufferedOutputStream 的“缓冲区”是 内存中的缓存区(具体是 JVM 堆内存的一部分),但它们的作用是优化数据的传输效率,并不是直接操作硬盘和内存之间的缓存。以下是详细解释:
1. 缓冲流的工作原理
(1) BufferedInputStream
-
作用:从底层输入流(如
FileInputStream)读取数据时,批量读取数据到内存缓冲区,减少直接访问硬盘的次数。 -
数据流向:
硬盘 → 操作系统内核缓冲区 → JVM 堆内存缓冲区 → 应用程序内存(变量、对象)-
缓冲区的数据由 JVM 管理,应用程序通过
read()方法从缓冲区读取。
-
(2) BufferedOutputStream
-
作用:将数据先写入内存缓冲区,缓冲区满后批量写入底层输出流(如
FileOutputStream),减少直接写硬盘的次数。 -
数据流向:
应用程序内存(变量、对象) → JVM 堆内存缓冲区 → 操作系统内核缓冲区 → 硬盘-
调用
flush()或关闭流时,强制将缓冲区数据写入底层流。
-
2. 内存缓存区与内存之间的关系
(1) 内存缓存区的位置
-
缓冲区本身就在内存中:无论是
BufferedInputStream还是BufferedOutputStream,它们的缓冲区都是 JVM 堆内存的一部分。 -
应用程序内存:开发者通过代码操作的变量、对象,也位于 JVM 堆内存中。
(2) 数据在内存中的流动
-
BufferedInputStream的流程:
硬盘数据 → 操作系统内核缓冲区 → JVM 堆内存缓冲区 → 应用程序变量(如byte[]或String)。-
例如:
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("data.txt")); byte[] buffer = new byte[1024]; bis.read(buffer); // 从 JVM 缓冲区读取到应用程序的 buffer 数组
-
-
BufferedOutputStream的流程:
应用程序变量 → JVM 堆内存缓冲区 → 操作系统内核缓冲区 → 硬盘。-
例如:
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("data.txt")); bos.write("Hello".getBytes()); // 数据先写入 JVM 缓冲区 bos.flush(); // 强制将缓冲区数据写入底层流
-
(3) 内存之间的数据传输
-
JVM 堆内存缓冲区 ↔ 应用程序内存:通过 Java 代码直接操作(如
read()或write()方法)。 -
操作系统内核缓冲区 ↔ JVM 堆内存:由底层系统调用(如
read()、write())自动完成,开发者无需干预。
3. 为什么需要缓冲区?
减少磁盘 I/O 次数:
直接读写硬盘速度慢,缓冲区通过批量操作减少对底层资源的访问次数。
例如:
BufferedInputStream一次性读取 8KB 数据到内存,后续read()直接从内存取数据。降低系统调用开销:
每次读写硬盘都需要系统调用(内核态切换),缓冲区减少系统调用次数。
提升程序性能:
内存操作速度远高于磁盘操作,缓冲区充当数据的“中转站”。
4. 缓冲区的默认大小
-
BufferedInputStream/BufferedOutputStream:默认缓冲区大小为 8KB(8192 字节)。 -
自定义缓冲区大小:
// 设置缓冲区大小为 16KB BufferedInputStream bis = new BufferedInputStream(new FileInputStream("data.txt"), 16384);
5. 缓冲流与其他缓存的关系
(1) 操作系统内核缓冲区
-
位置:由操作系统管理的内存区域,不属于 JVM 堆内存。
-
作用:缓存磁盘数据,加速对硬盘的读写操作。
-
对开发者透明:无法通过 Java 代码直接操作。
(2) JVM 堆内存缓冲区
-
位置:JVM 堆内存的一部分,由 Java 程序管理。
-
作用:
BufferedInputStream/BufferedOutputStream使用的缓冲区。
(3) 磁盘缓存(硬件级缓存)
-
位置:硬盘控制器或磁盘驱动器的硬件缓存。
-
作用:临时存储读写数据,减少磁头移动次数。
6. 总结
| 组件 | 作用 |
|---|---|
BufferedInputStream | 通过内存缓冲区减少硬盘读取次数,提升读取效率。 |
BufferedOutputStream | 通过内存缓冲区减少硬盘写入次数,提升写入效率。 |
| JVM 堆内存缓冲区 | 缓冲流的实际存储位置,数据在内存中批量处理。 |
| 操作系统内核缓冲区 | 由操作系统管理的磁盘缓存,对开发者透明。 |
关键结论:
-
缓冲流的“缓冲区”是 JVM 堆内存的一部分,数据在 硬盘 ↔ 内核缓冲区 ↔ JVM 缓冲区 ↔ 应用程序内存 之间流动。
-
开发者只需通过
read()/write()操作数据,底层细节由 JVM 和操作系统处理。
相关文章:
内存中的缓存区
在 Java 的 I/O 流设计中,BufferedInputStream 和 BufferedOutputStream 的“缓冲区”是 内存中的缓存区(具体是 JVM 堆内存的一部分),但它们的作用是优化数据的传输效率,并不是直接操作硬盘和内存之间的缓存。以下是详…...
【pytest框架源码分析一】pluggy源码分析之hook常用方法
简单看一下pytest的源码,其实很多地方是依赖pluggy来实现的。这里我们先看一下pluggy的源码。 pluggy的目录结构如下: 这里主要介绍下_callers.py, _hooks.py, _manager.py,其中_callers.py主要是提供具体调用的功能,_hooks.py提…...
《Kafka 理解: Broker、Topic 和 Partition》
Kafka 核心架构解析:从概念到实践 Kafka 是一个分布式流处理平台,广泛应用于日志收集、实时数据分析和事件驱动架构。本文将从 Kafka 的核心组件、工作原理、实际应用场景等方面进行详细解析,帮助读者深入理解 Kafka 的架构设计及其在大数据领域的重要性。 1. Kafka 的背…...
【AHK】资源管理器自动化办公实例/自动连点设置
此处为一个自动连续点击打开检查的自动化操作案例,没有quicker的鼠键录制,不常用了,做个备份 #MaxThreadsPerHotkey 2 ; 这个是核心!!!!确保可以同时运行多个热键或标签global isRunning : tru…...
在docker容器中运行vllm部署deepseek-r1大模型
# 在本地部署python环境 cd /app/ python -m venv myenv # 激活虚拟环境 source /app/myenv/activate # 要撤销激活一个虚拟环境,请输入: deactivate# 进入虚拟环境安装modelscope pip install modelscope# 下载大模型(7B为例) modelscope do…...
Django基础环境准备
Django基础环境准备 文章目录 Django基础环境准备1.准备的环境 win11系统(运用虚拟环境搭建)1.1详见我的资源win11环境搭建 2.准备python环境2.1 winr 打开命令提示符 输入cmd 进入控制台2.2 输入python --version 查看是否有python环境2.3在pyhton官网下…...
使用DeepSeek实现自动化编程:类的自动生成
目录 简述 1. 通过注释生成C类 1.1 模糊生成 1.2 把控细节,让结果更精准 1.3 让DeepSeek自动生成代码 2. 验证DeepSeek自动生成的代码 2.1 安装SQLite命令行工具 2.2 验证DeepSeek代码 3. 测试代码下载 简述 在现代软件开发中,自动化编程工具如…...
nio使用
NIO : new Input/Output,,在java1.4中引入的一套新的IO操作API,,,旨在替代传统的IO(即BIO:Blocking IO),,,nio提供了更高效的 文件和网络IO的 操作…...
【考试大纲】中级网络工程师考试大纲(最新版与旧版对比)
目录 引言考试科目1:网络工程师基础知识考试科目2:网络工程师应用技术引言 最新的网络工程师考试大纲出版于 2024 年 10 月,本考试大纲基于此版本整理。 考试科目1:网络工程师基础知识 计算机系统知识1.1 计算机硬件知识 1.2 操作系统知识 1.3 系统管理 系统开发和运行…...
Spring的下载与配置
1. 下载spring开发包 下载地址:https://repo.spring.io/webapp/#/artifacts/browse/simple/General/libs-release-local/org/springframework/spring 打开之后可以看到有很多版本供选择,因为视频教程用的是4.2.4版本,于是我也选择这个 右键…...
解决IDEA使用Ctrl + / 注释不规范问题
问题描述: ctrl/ 时,注释缩进和代码规范不一致问题 解决方式 设置->编辑器->代码样式->java->代码生成->注释代码...
学术小助手智能体
学术小助手:开学季的学术领航员 文心智能体平台AgentBuilder | 想象即现实 文心智能体平台AgentBuilder,是百度推出的基于文心大模型的智能体平台,支持广大开发者根据自身行业领域、应用场景,选取不同类型的开发方式,…...
kafka-leader -1问题解决
一. 问题: 在 Kafka 中,leader -1 通常表示分区的领导者副本尚未被选举出来,或者在获取领导者信息时出现了问题。以下是可能导致出现 kafka leader -1 的一些常见原因及相关分析: 1. 副本同步问题: 在 Kafka 集群中&…...
【开源-鸿蒙土拨鼠大理石系统】鸿蒙 HarmonyOS Next App+微信小程序+云平台
✨本人自己开发的开源项目:土拨鼠充电系统 ✨踩坑不易,还希望各位大佬支持一下,在GitHub给我点个 Start ⭐⭐👍👍 ✍GitHub开源项目地址👉:https://github.com/lusson-luo/HarmonyOS-groundhog-…...
HBuilder X中,uni-app、js的延时操作及定时器
完整源码下载 https://download.csdn.net/download/luckyext/90430165 在HBuilder X中,uni-app、js的延时操作及定时器可以用setTimeout和setInterval这两个函数来实现。 1.setTimeout函数用于在指定的毫秒数后执行一次函数。 例如, 2秒后弹出一个提…...
下载pyenv
安装 1、git clone https://gitclone.com/github.com/pyenv/pyenv.git ~/.pyenv 备用:git clone https://hub.fgit.ml/pyenv/pyenv.git ~/.pyenv 配置环境变量 export PYENV_ROOT"$HOME/.pyenv" export PATH"$PYENV_ROOT/bin:$PATH"然后&…...
升级TTSDK抖音小游戏banner广告接入
升级TTSDK抖音小游戏banner广告接入 介绍修改总结 介绍 我们原来使用的是unity2021,这次为了抖音新出的TTSDK中的新的API升级我们将项目升级为了unity2022,这次抖音官方剔除了原来StartSDKUnityTools和Start Asset Analyser(startmini&#x…...
vue 项目部署到nginx 服务器
一 vue 项目打包 1 本地环境 npm run build 2 打包完成生成一个dist 文件夹,将其放到服务器指定的文件夹,此文件夹可以在nginx 配置文件中配置 二 nginx 1 根据对应的系统搜索安装命令 sudo yum install nginx 2 查看conf位置 如果不知道的话 ng…...
ubuntu终端指令集 shell编程基础(一)
磁盘指令 连接与查看:磁盘与 Ubuntu 有两种连接方式;使用ls /dev/sd*查看是否连接成功,通过df系列指令查看磁盘使用信息。若 U 盘已挂载,相关操作可能失败,需用umount取消挂载。磁盘操作:使用sudo fdisk 磁…...
win11编译pytorch cuda128版本流程
Geforce 50xx系显卡最低支持cuda128,torch cu128 release版本目前还没有释放,所以自己基于2.6.0源码自己编译wheel包。 1. 前置条件 1. 使用visual studio installer 安装visual studio 2022,工作负荷选择【使用c的桌面开发】,安装完成后将…...
STM32G431RBT6——(1)芯片命名规则
相信很多新手入门STM学的芯片,是STM32F103C8T6,假如刷到个项目换个芯片类型,就会感到好难啊,看不懂,就无从下手,不知所云。其实没什么难的,对于一个个不同的芯片的区别,就像是学习包…...
mac Homebrew安装、更新失败
我这边使用brew安装git-lfs 一直报这个错: curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL更新brew update也是报这个错误。最后使用使用大佬提供的脚本进行操作: /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/mast…...
Ecode前后端传值
说明 在泛微 E9 系统开发过程中,使用 Ecode 调用后端接口并进行传值是极为常见且关键的操作。在上一篇文章中,我们探讨了 Ecode 调用后端代码的相关内容,本文将深入剖析在 Ecode 中如何向后端传值,以及后端又该如何处理接收这些值…...
Wireshark:自定义类型帧解析
文章目录 1. 前言2. 背景3. 开发 Lua 插件 1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。 2. 背景 Wireshark 不认识用 tcpdump 抓取的数据帧,仔细分析相关代码和数据帧后,…...
每日学习Java之一万个为什么?[MySQL面试篇]
分析SQL语句执行流程中遇到的问题 前言1 MySQL是怎么在一台服务器上启动的2 MySQL主库和从库是同时启动保持Alive的吗?3 如果不是主从怎么在启动的时候保证数据一致性4 ACID原则在MySQL上的体现5 数据在MySQL是通过什么DTO实现的6 客户端怎么与MySQL Server建立连接…...
Spring 为何需要三级缓存解决循环依赖,而不是二级缓存
Spring 使用三级缓存来解决循环依赖问题,而不是仅使用二级缓存,主要是为了同时满足依赖注入和 AOP 代理的需求。以下是详细解释: ### Spring 三级缓存的作用 Spring 的三级缓存分别用于不同的场景: 1. **一级缓存(sin…...
2继续NTS库学习(读取shapefile)
引用库如下: 读取shapefile代码如下: namespace IfoxDemo {public class Class1{[CommandMethod("xx")]public static void nts二次学习(){Document doc Application.DocumentManager.MdiActiveDocument;var ed doc.Editor;string shpPath …...
避免 Git 文件名大小写出错
一、如何避免大小写出错? 配置 Git 全局忽略大小写 在 Windows 上,默认 Git 会忽略大小写。建议全局关闭此行为: git config --global core.ignorecase false统一团队命名规范 强制约定文件名全小写(如 config.json)或…...
JavaWeb后端基础(3)
原打算把Mysql操作数据库的一些知识写进去,但是感觉没必要,要是现在会的都是简单的增删改查,所以,这一篇,我直接从java操作数据库开始写,所以这一篇大致就是记一下JDBC、MyBatis、以及SpringBoot的配置文件…...
Vue程序下载
Vue是一个基于JavaScript(JS)实现的框架,想要使用它,就得先拿到Vue的js文件 Vue官网 Vue2:Vue.js Vue3:Vue.js - 渐进式 JavaScript 框架 | Vue.js 下载并安装vue.js 第一步:打开Vue2官网&a…...
