我们知道,文件是写在磁盘中的,而程序的运行又要借助于内存。那么怎么实现内存和磁盘的“互动”呢?这就要借助“流”来实现了。

        内存具体指的就是我们的java程序,而磁盘具体指的是我们的文件。从磁盘到内存叫输入,从内存到磁盘叫输出

        流就相当于一位“外卖小哥”,在内存和磁盘之间来回穿行,携带数据。流有以下几种分类:

 字节流字符流
输入流InputStreamReader
输出流OutputStreamWriter

        如果按照流的角色,还可以分为节点流,处理流/包装流。今天我们要讲的是字节流中的输入流。

        字节流适用于所有类型数据,因为它是对数据最底层的操作,直接以字节为单位进行读写的。我们在d盘里创建一个Test97.txt文件并在其中写入“Hello,world”。

        我们创建一个文件输入流FileInputStream对象,将文件路径放到其中去,我们的目的是读取到文件中的数据:

String FilePath = "d:\\Test97.txt";
FileInputStream fileInputStream0 = new FileInputStream(FilePath);

        我这里创建了一个ArrayList数组list存储数据,并使用read()方法读取数据。注意,read方法一次只能读取一个字节的数据,并且返回值为int类型。当读取完毕时,会返回值-1。

//接收数据
ArrayList<Character>list = new ArrayList<>();
int read0 = 0;
while((read0 = (fileInputStream0.read())) != -1) {list.add((char)read0);
}

        创建好一个Character类型的数组,再将接受到的数据进行强制类型转换,放进数组中。

        这里为什么我要用read0来接收数据呢?因为如果直接使用fileInputStream0.read()!=-1方法来判断是否接受完毕,再使用list.add((char)fileInputStream0.read());接收数据,实际上总共接受了两次数据,会导致接收的数据错误。

        最后需要关闭文件流,释放资源:

fileInputStream0.close();

        可以遍历查看数组中的元素是否为我们想要的内容。

        read还提供了一种常用的构造方法:read(byte[] b),在read里传入一个byte类型的数组,将文件内容读取到byte类型数组中去,增强了文件读取效率。

        这里我们创建另一个FileInputStream对象,并创建一个长度为5的byte类型数组来接受数据:

String FilePath = "d:\\Test97.txt";
FileInputStream fileInputStream1 = new FileInputStream(FilePath);
//创建接受的byte数组
byte[] b = new byte[5];

        这里要注意了,读取文件内容的长度最多不超过b.length个字节。超出的字节可以被下一次读取到,但同样不超过b.length个字节。

        如果read(byte[] b)方法读取正常,会返回实际读取字节数。

//直接读取
fileInputStream1.read(b);
//释放资源
fileInputStream1.close();

        同样可以遍历b数组并强制类型转换来查看是否导入成功:

//转成char类型
for(byte i:b) {System.out.print((char)i);
}

        好了,字节输入流就讲到这里,下次我们聊一聊字节输出流。

        

        

 

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

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

相关文章

23种设计模式——桥接模式 (Bridge Pattern)详解

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。 &#x1f34e;个人主页&#xff1a;Meteors.的博客 &#x1f49e;当前专栏&#xff1a;设计模式 ✨特色专栏&#xff1a;知识分享 &#x…

Python爬虫实战:研究Axes Grid模块,构建旅游平台酒店数据采集和分析系统

1. 引言 1.1 研究背景 随着互联网技术的飞速发展,全球数据总量呈现指数级增长。据国际数据公司(IDC)预测,到 2025 年全球数据圈将达到 175ZB,其中非结构化数据占比超过 80%。这些数据广泛分布于各类网站平台,包含着用户行为、市场趋势、产品特征等丰富信息。如何高效获…

光照边疆平台|面向边疆地区的现代化内容与信息服务系统

光照边疆平台&#xff5c;面向边疆地区的现代化内容与信息服务系统聚焦“边疆资讯 边疆风光 用户互动 后台可视化管控”的高颜值内容平台&#xff0c;适合展示、传播与运营边疆主题内容。系统定位与价值 主题聚焦&#xff1a;以“边疆”为核心&#xff0c;统一内容语义与视觉…

删除元素(不是删除而是覆盖)快慢指针 慢指针是覆盖位置,快指针找元素

&#x1f4dd; 题目&#xff1a;移除元素题目描述&#xff1a; 给定数组和值val&#xff0c;原地移除所有等于val的元素&#xff0c;返回新长度。例子&#xff1a; nums [3,2,2,3], val 3 → nums [2,2,_,_], return 2&#x1f525; 暴力法思路&#xff1a;暴力法想法&#…

10 【C++】泛型编程

文章目录前言泛型编程&#xff08;模板&#xff09;1. 函数模板1.1 函数模板格式1.2 函数模板的实例化隐式实例化显式指定模板参数实例化1.3 函数模板实例化的原理1.4 模板参数的匹配原则2. 类模板2.1 类模板的格式2.2 类模板的实例化2.3 类模板实例化的原理2.4 类模板的匹配原…

【基于YOLO和Web的交通工具识别系统】

系统功能 视频检测&#xff1a;对输入的视频流进行实时或离线分析&#xff0c;自动识别视频中出现的交通工具&#xff08;如飞机、自行车等&#xff09;及行人&#xff0c;输出包含目标类别、位置等信息的检测结果。摄像检测&#xff1a;通过连接摄像头设备&#xff0c;对实时…

Python进程,线程

目录 一、多任务 1.1定义 1.2具体体现 1.3并发和并行 1.3.1并发操作 1.3.2并行操作 1.3.3对比 二、进程 2.1概念 2.2特点 2.3进程状态 2.4多进程 2.5多进程实现 2.6进程锁 三、线程 3.1概念 3.2特点 3.3适用场景 3.4多线程实现 四、对比 4.1关系对⽐ 4.2区…

【Element Plus 表单组件样式统一 CSS 文字特效实现指南】

Element Plus 表单组件样式统一 & CSS 文字特效实现指南 前言 在使用 Element Plus 组件库开发表单页面时&#xff0c;我们遇到了一个看似简单却很有趣的问题&#xff1a;el-input、el-select 和 el-textarea 在禁用状态下的文字颜色不一致。通过深入研究&#xff0c;我们…

网络通信与协议栈 -- OSI,TCP/IP模型,协议族,UDP编程

网络通信的核心是实现不同主机上进程间的数据交换&#xff0c;其技术体系围绕 “协议分层模型” 展开&#xff0c;向下依赖硬件介质传输电 / 光信号&#xff0c;向上支撑各类网络应用&#xff08;如网页浏览、文件传输&#xff09;。本文结合 OSI 理论框架与 TCP/IP 工业标准&a…

HarmonyOS 新一代声明式 UI 弹窗机制:从 AlertDialog 到 CustomDialogController 的深度解析与实践

好的&#xff0c;请看这篇关于 HarmonyOS 新一代声明式 UI 弹窗机制的技术文章。 HarmonyOS 新一代声明式 UI 弹窗机制&#xff1a;从 AlertDialog 到 CustomDialogController 的深度解析与实践 引言 在 HarmonyOS 应用开发中&#xff0c;弹窗&#xff08;Dialog&#xff09;是…

混合推理模型(快思考、慢思考模型)

目录基础transformer架构、transformers库预训练模型的微调&#xff08;Fine-tuning&#xff09;预训练微调的大模型应用模式base 模型、instruct 模型区别Hugging Face 上如何查看base模型、instruct模型混合推理模型大模型里的快思考 vs 慢思考qwen3模型含特殊 ChatML / 模型…

prometheus+grafana搭建

部署 prometheus 安装 # 1,下载 wget https://github.com/prometheus/prometheus/releases/download/v2.45.1/prometheus-3.5.0.linux-amd64.tar.gz# 2,部署 tar -zxvf prometheus-3.5.0.linux-amd64.tar.gz -C /opt/ cd /opt/ mv ./prometheus-3.5.0.linux-amd64 …

MR30分布式I/O在面机装备中的应用

随着食品加工行业向自动化、智能化转型&#xff0c;面机装备对控制系统的响应速度、布线灵活性及稳定性提出了更高要求。本案例以某大型食品机械制造企业的全自动面条生产线升级项目为背景&#xff0c;引入 MR30 分布式 IO 模块替代传统集中式 IO 方案。通过将 MR30 分布式 IO …

Matlab使用小技巧合集(系列四):Table类型高效用法与数据处理实战

Matlab使用小技巧合集(系列四):Table类型高效用法与数据处理实战 在科研数据处理和论文写作过程中,结构化数据的管理极为重要。Matlab的table类型为研究生和科研人员提供了灵活、高效的数据存储与处理方式,尤其适合实验结果整理、分组统计、数据预处理等场景。本文将系统介…

STM32的时钟系统与时钟树的配置

STM32的时钟系统是其微控制器&#xff08;MCU&#xff09;的核心组成部分&#xff0c;负责为CPU、外设和存储器等模块提供精确的时序信号。其设计灵活且复杂&#xff0c;通过多级时钟树&#xff08;Clock Tree&#xff09;实现时钟源的选择、分频和分配。以下是详细介绍&#x…

NV 工具metrics分析(ncu, nsys/torch profiler)

以下分析都以A100硬件架构为例; Theoretical Max Active Warps per SM: 64 Register number: 512 (规定每个thread不能超过256) Theoretical Active Warps per SM [warp]&#xff1a;512//registers_per_thread*4, which defines theoretical active warp occupancy Waves P…

[CISCN2019 总决赛 Day2 Web1]Easyweb

登录界面可以看到随机切换的图片。从页面源码中可以看到<div class"avtar"><img src"image.php?id3" width"200" height"200"/></div>&#xff0c;图片文件的请求地址&#xff0c;并且有传参id。web应用中像这种动…

第 3 讲:KAFKA生产者(Producer)详解

这是一篇既照顾入门也能给高级工程师提供落地经验的实战笔记。0. TL;DR&#xff08;先上结论&#xff09; 想稳&#xff1a;acksall 合理 retries&#xff1b;需要“分区内不重不丢”→ 再加 enable.idempotencetrue 且 max.in.flight<5。想快&#xff1a;适度增大 batch.s…

微信小程序截屏与录屏功能详解

微信小程序提供了丰富的API支持截屏和录屏功能&#xff0c;适用于多种场景&#xff0c;如教育类应用的课程录制、游戏类应用的精彩瞬间分享、电商类应用的商品展示等。以下将详细介绍实现方法和应用案例。 截屏功能实现 截屏功能通过调用wx.canvasToTempFilePath或wx.captureSc…

React 中的 HOC 和 Hooks

写在前面 在函数式组件主导的 React 项目中&#xff0c;高阶组件&#xff08;HOC&#xff09;并非首选推荐&#xff0c;更建议优先使用 Hooks来实现复用逻辑。核心原因是 HOC 存在固有的设计缺陷&#xff0c;而 Hooks 能更优雅、简洁地解决相同问题&#xff0c;同时避免 HOC 的…