当前位置: 首页 > news >正文

Java——IO流(一)-(6/8):字节流-FileInputStream 每次读取多个字节(示例演示)、一次读取完全部字节(方式一、方式二,注意事项)

目录

文件字节输入流:每次读取多个字节

实例演示

注意事项

文件字节输入流:一次读取完全部字节

方式一

方式二

注意事项


文件字节输入流:每次读取多个字节

用到之前介绍过的常用方法:

实例演示

需求:用每次读取多个字节的方法读出File文件的内容

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;public class FileInputStreamTest2 {public static void main(String[] args) throws Exception {//1.创建一个字节输入流对象代表字节输入流管道与源文件接通。InputStream is = new FileInputStream("HelloWorld\\src\\file.txt");//2.开始读取文件中的字节数据:每次读取多个字节。//public int read(byte b[]) throws IoException//每次读取多个字节到字节数组中去,返回读取的字节数量,读取完毕会返回-1byte[] buffer = new byte[3];int len = is.read(buffer);String rs = new String(buffer);System.out.println(rs);System.out.println("当前读取的字节数量:" + len);//目标文件有5个字节,需要再读取一次//注意:读取多少,倒出多少int len2 = is.read(buffer);String rs2 = new String(buffer,0,len2);System.out.println(rs2);System.out.println("当前读取的字节数量:" + len2);int len3 = is.read(buffer);System.out.println(len3);   //-1is.close(); //关闭流}
}

运行结果:

使用循环改造一下

package user.IOTestOne;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;public class FileInputStreamTest2 {public static void main(String[] args) throws Exception {//1.创建一个字节输入流对象代表字节输入流管道与源文件接通。InputStream is = new FileInputStream("HelloWorld\\src\\file.txt");//使用循环byte[] buffer = new byte[3];int len;    //记住每次读取了多少个字节while((len = is.read(buffer)) != -1){//注意:读取多少,倒出多少String rs = new String(buffer,0,len);System.out.println(rs);}//性能得到了明显的提升//但是这种方案也不能避免读取汉字输出乱码的问题is.close(); //关闭流}
}

运行结果:

注意事项

  • 使用FilelnputStream每次读取多个字节,读取性能得到了提升,但读取汉字输出还是会乱码。

使用字节流读取中文,如何保证输出不乱码,怎么解决?

  • 定义一个与文件一样大的字节数组,一次性读取完文件的全部字节。

文件字节输入流:一次读取完全部字节

方式一

自己定义一个字节数组与被读取的文件大小一样大,然后使用该字节数组,一次读完文件的全部字节。

方法名称说明
public int read(byte[] buffer)每次用一个字节数组去读取,返回字节数组读取了多少个字节,如果发现没有数据可读会返回-1.

注意:文件存于硬盘中,硬盘的大小是极大的,文件的大小也可能会很大;但是我们定义的数组实际上存储于内存中,内存是很小的,无法给数组定义很大的长度;因此,这个方法只适合读取不那么大的文件。

选取案例还是那个File文件

package user.IOTestOne;import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;public class FileInputStreamTest3 {public static void main(String[] args) throws Exception{//1.创建一个字节输入流管道与源文件接通InputStream is = new FileInputStream("HelloWorld/src/file.txt");//2.准备一个字节数组,大小与文件的大小正好一样大。File f = new File("HelloWorld/src/file.txt");long size = f.length();byte[] buffer = new byte[(int) size];int len = is.read(buffer);System.out.println(new String(buffer));System.out.println("文件大小:" + size + "字节");System.out.println(len);is.close();}
}

运行结果:

方式二

  • Java官方为lnputStream提供了如下方法,可以直接把文件的全部字节读取到一个字节数组中返回。
方法名称说明
public byte[] readAllBytes()throws IOException直接将当前字节输入流对应的文件对象的字节数据装到一个字节数组返回
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;public class FileInputStreamTest3 {public static void main(String[] args) throws Exception{//1.创建一个字节输入流管道与源文件接通InputStream is = new FileInputStream("HelloWorld/src/file.txt");byte[] buffer = is.readAllBytes();  //JDK8 之后新增的方法System.out.println(new String(buffer));is.close();}
}

运行结果:

注意事项

直接把文件数据全部读取到一个字节数组可以避免乱码,是否存在问题?

  • 如果文件过大,创建的字节数组也会过大,可能引起内存溢出。

其实,读写文本内容本适合用字符流

字节流适合做数据的转移,如:文件复制等。

下篇就开始介绍字符流。


END


学习自:黑马程序员——Java课程

相关文章:

Java——IO流(一)-(6/8):字节流-FileInputStream 每次读取多个字节(示例演示)、一次读取完全部字节(方式一、方式二,注意事项)

目录 文件字节输入流:每次读取多个字节 实例演示 注意事项 文件字节输入流:一次读取完全部字节 方式一 方式二 注意事项 文件字节输入流:每次读取多个字节 用到之前介绍过的常用方法: 实例演示 需求:用每次读取…...

服务器SSH 免密码登录

1. 背景 为了服务器的安全着想,设置的服务器密钥非常长。但是这导致每次连接服务器都需要输入一长串的密码,把人折腾的很痛苦,所以我就在想,能不能在终端SSH的时候无需输入密码。 windows 可以使用 xshell 软件,会自…...

Linux安装MySQL以及远程连接

1、Linux安装MySQL 1.1、准备解压包 MySQL5.x解压包 提取码:9y7n 1.2、通过rpm脚本安装 切记安装顺序:common --> libs --> client --> server 因为它们之间存在依赖关系,所以务必按照顺序安装 安装前请确保当前目录/文…...

SQL Server 数据库分页技术详解:选择最佳方法优化查询性能”。

当今数据驱动的应用程序中,数据库分页技术在优化查询性能和提升用户体验中扮演着重要角色。在 SQL Server 环境下,开发者面对大数据集时,常常需要选择合适的分页方法以平衡功能需求和性能优化。本文将详细介绍 SQL Server 中几种主要的分页技…...

electron录制-镜头缩放、移动

要求 1、当录屏过程中,鼠标点击,镜头应该往点击处拉近,等一段时间还原 2、录屏过程中,可能会发生多次点击,但是点击位置偏差大,可能会导致缩放之后,画面没出来,因此需要移动镜头帧 …...

红队内网攻防渗透:内网渗透之内网对抗:信息收集篇自动项目本机导出外部打点域内通讯PillagerBloodHound

红队内网攻防渗透 1. 内网自动化信息收集1.1 本机凭据收集类1.1.1、HackBrowserData 快速获取浏览器的账户密码1.1.2、Searchall 快速搜索服务器中的有关敏感信息还有浏览器的账户密码1.1.3、Pillager 适用于后渗透期间的信息收集工具,可以收集目标机器上敏感信息1.2 对外打点…...

2024最新IDEA插件开发+发布全流程 SelectCamelWords[选中驼峰单词](idea源代码)

2024最新IDEA插件开发(发布)-SelectCamelWords[选中驼峰单词](idea源代码) 参考文档 Jetbrains Idea插件开发文档: https://plugins.jetbrains.com/docs/intellij/welcome.html代码地址:https://github.com/yangfeng…...

【网络安全】网络安全基础精讲 - 网络安全入门第一篇

目录 一、网络安全基础 1.1网络安全定义 1.2网络系统安全 1.3网络信息安全 1.4网络安全的威胁 1.5网络安全的特征 二、入侵方式 2.1黑客 2.1.1黑客入侵方式 2.1.2系统的威胁 2.2 IP欺骗 2.2.1 TCP等IP欺骗 2.2.2 IP欺骗可行的原因 2.3 Sniffer探测 2.4端口扫描技术…...

初识 GPT-4 和 ChatGPT

文章目录 LLM 概述理解 Transformer 架构及其在 LLM 中的作用解密 GPT 模型的标记化和预测步骤 想象这样⼀个世界:在这个世界里,你可以像和朋友聊天⼀样快速地与计算机交互。那会是怎样的体验?你可以创造出什么样的应用程序?这正是…...

【C语言】解决C语言报错:Array Index Out of Bounds

文章目录 简介什么是Array Index Out of BoundsArray Index Out of Bounds的常见原因如何检测和调试Array Index Out of Bounds解决Array Index Out of Bounds的最佳实践详细实例解析示例1:访问负索引示例2:访问超出上限的索引示例3:循环边界…...

【C++】一个极简但完整的C++程序

一、一个极简但完整的C程序 我们编写程序是为了解决问题和任务的。 1、任务: 某个书店将每本售出的图书的书名和出版社,输入到一个文件中,这些信息以书售出的时间顺序输入,每两周店主会手工计算每本书的销售量、以及每个出版社的…...

Lua迭代器详解(附加红点功能实例)

Lua迭代器详解与用法 1. 什么是迭代器2. 为什么需要理解迭代器的原理3. 迭代器的实现0. 闭包1. 有状态迭代器2. 无状态迭代器 4. 红点树系统基础 1. 什么是迭代器 迭代器是一种能让我们遍历一个集合中的所有元素的代码结构。比如常用ipairs()和pairs()。 2. 为什么需要理解迭代…...

锂磷硫(LPS)属于硫化物固态电解质 Li7P3S11是代表性产品

锂磷硫(LPS)属于硫化物固态电解质 Li7P3S11是代表性产品 锂磷硫(LPS),为非晶态材料,是硫化物固态电解质代表性产品之一,具有热稳定性好、成本较低等优点,在固态电解质中离子电导率较…...

PointCloudLib 点云边缘点提取 C++版本

0.实现效果 1.算法原理 PCL(Point Cloud Library)中获取点云边界的算法主要基于点云数据的几何特征和法向量信息。以下是对该算法的详细解释,按照清晰的格式进行归纳: 算法概述 PCL中的点云边界提取算法主要用于从3D点云数据中识别并提取出位于物体边界上的点。这些边界…...

【Qt】QList<QVariantMap>中数据修改

1. 问题 QList<QVariantMap> 类型中&#xff0c;修改QVariantMap中的值。 2. 代码 //有效代码1QVariantMap itemMap itemList.at(0);itemMap.insert("title", "test");itemList.replace(0, itemMap);//有效代码 2itemList.operator [](0).insert(…...

如何避免vue的url中使用hash符号?

目录 1. 安装 Vue Router 2. 配置 Vue Router 使用 history 模式 3. 更新 main.js 4. 配置服务器以支持 history 模式&#xff08;此处需要仔细测试&#xff09; a. Nginx 配置 b. Apache 配置 5. 部署并测试 总结 在 Vue.js 项目中&#xff0c;避免 URL 中出现 # 符号的…...

Java学习 - MySQL存储过程、函数和触发器练习实例

存储过程 存储过程是什么 存储过程是一组已经编译好的SQL语句存储过程优点有什么 安全 性能高 提高代码复用性创建存储过程的语法 DELIMITER $ # 不能加分号CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参数名 参数类型) BEGIN存储过程语句块 END;$DELIMITER ;创建一个无参的存储…...

【深度神经网络 (DNN)】

深度神经网络 (DNN) 深度神经网络 (DNN) 是机器学习领域中一种强大的工具&#xff0c;它由多层神经元组成&#xff0c;能够学习复杂的数据模式&#xff0c;解决各种任务&#xff0c;如图像识别、语音识别、自然语言处理等。 DNN 的构成&#xff1a; 神经元: DNN 的基本单元&…...

ES全文检索支持繁简和IK分词检索

ES全文检索支持繁简和IK分词检索 1. 前言2. 引入繁简转换插件analysis-stconvert2.1 下载已有作者编译后的包文件2.2 下载源码进行编译2.3 复制解压插件到es安装目录的plugins文件夹下 3. 引入ik分词器插件3.1 已有作者编译后的包文件3.2 只有源代码的版本3.3 安装ik分词插件 4…...

解决Visual Studio Code在Ubuntu上崩溃的问题

解决Visual Studio Code在Ubuntu上崩溃的问题 我正在使用Ubuntu系统&#xff0c;每次打开Visual Studio Code时&#xff0c;只能短暂打开一秒钟&#xff0c;然后就会崩溃。当通过终端使用code --verbose命令启动Visual Studio Code时&#xff0c;出现以下错误信息&#xff1a;…...

Cortex-M中断优先级配置与优化实践

1. 中断处理机制基础解析在嵌入式系统开发中&#xff0c;中断处理是最核心的机制之一。Cortex-M系列处理器采用嵌套向量中断控制器(NVIC)来管理中断优先级&#xff0c;其设计哲学是允许高优先级中断打断低优先级中断的执行&#xff0c;形成中断嵌套。这种机制确保了关键任务能够…...

CVE、CNNVD、CNVD傻傻分不清?一文搞懂主流漏洞库的区别与实战用法

CVE、CNNVD、CNVD&#xff1a;主流漏洞库核心差异与工程化应用指南 当安全工程师在凌晨三点被漏洞告警惊醒时&#xff0c;第一反应往往是查证漏洞详情。但面对CVE、CNNVD、CNVD这些缩写&#xff0c;连资深从业者都可能陷入选择困难。这三个字母组合背后&#xff0c;代表着全球漏…...

【亲测免费】 电机速度闭环控制(代码详细注释)

电机速度闭环控制&#xff08;代码详细注释&#xff09; 【下载地址】电机速度闭环控制代码详细注释 本仓库提供了电机速度闭环控制的实践教程&#xff0c;特别适合对电机控制、尤其是PID控制算法感兴趣的学习者。PID控制是一种广泛应用于工程领域的闭环控制策略&#xff0c;能…...

【免费下载】 Airplayer:苹果设备投屏的终极解决方案

Airplayer&#xff1a;苹果设备投屏的终极解决方案 【下载地址】Airplayer苹果投屏软件 Airplayer是一款专为苹果设备设计的高效投屏软件&#xff0c;它允许用户轻松地将iPhone或iPad屏幕的内容无线传输到电脑上显示。无论是播放视频、展示照片、进行会议演示还是游戏分享&…...

NotebookLM具身智能落地实战(从零部署到ROS2集成):谷歌AI团队内部培训手册泄露版

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;NotebookLM具身智能研究 NotebookLM 是 Google 推出的基于用户自有文档进行语义理解与推理的 AI 助手&#xff0c;其核心能力在于“文档感知”&#xff08;document-grounded reasoning&#xff09;。当…...

从沙子到车辙(1.5):从图灵机到 ECU

1.5 从图灵机到 ECU 一座恶魔般的机房 1945 年&#xff0c;费城&#xff0c;宾夕法尼亚大学摩尔工程学院。 一座 30 吨重的巨兽蹲在一间约 167 平方米的机房里。它的名字叫 ENIAC&#xff08;Electronic Numerical Integrator and Computer&#xff09;——世界上第一台通用…...

基于WiFi与OPC协议的可穿戴LED灯光同步系统设计与实现

1. 项目概述&#xff1a;打造你的无线光影秀发想象一下&#xff0c;你亲手制作的LED帽子、发光外套&#xff0c;甚至是手中的光绘道具&#xff0c;都能随着你电脑屏幕上的音乐可视化效果或视频内容同步闪烁、流动。无需复杂的编程&#xff0c;只需一个简单的播放指令&#xff0…...

支付系统架构设计:从交易核心到资金核算的稳定性实践

1. 支付系统总览&#xff1a;从业务到资金的桥梁但凡涉及在线交易的公司&#xff0c;支付系统都是其技术架构中当之无愧的“心脏”。它远不止是调用一个第三方支付接口那么简单&#xff0c;而是一套连接用户、业务、资金渠道和内部账务的复杂工程体系。一个设计得当的支付系统&…...

开源写作助手:本地化部署的智能文本分析与AI辅助创作工具

1. 项目概述&#xff1a;一个为写作者量身定制的智能工具箱如果你经常需要写点东西&#xff0c;无论是技术文档、博客文章、工作报告&#xff0c;还是小说草稿&#xff0c;大概率都经历过这样的时刻&#xff1a;对着空白文档发呆&#xff0c;感觉大脑一片空白&#xff1b;或者写…...

EFFACT架构:全同态加密硬件加速的创新设计

1. EFFACT架构概述&#xff1a;当硬件设计遇上全同态加密在密码学加速器的世界里&#xff0c;我们一直在寻找一个平衡点——如何在有限的芯片面积和功耗预算下&#xff0c;处理那些看似无解的复杂计算&#xff1f;EFFACT架构的诞生&#xff0c;正是为了解决全同态加密&#xff…...