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

Java 之 IO流

一、IO流概述

在计算机编程中,IO流(Input/Output Stream)是处理设备间数据传输的关键技术。简单来说,IO流就是以流的方式进行输入输出,数据被当作无结构的字节序或字符序列来处理。在Java等编程语言中,IO流用于操作数据的类都集中在IO包中。

二、IO流的分类

  • 按流向分类

    • 输入流:用于从数据源(如文件、键盘)读取数据。
    • 输出流:用于向目标(如文件、屏幕)写入数据。
  • 按操作类型分类

    • 字节流:以字节为单位进行操作,适用于所有类型的数据。
    • 字符流:以字符为单位进行操作,更便于处理文本数据。

三、字节流详解

  • 字节输入流(InputStream)

FileInputStream:从文件中读取数据的常用类。

// 示例:使用FileInputStream读取文件内容
FileInputStream fis = null;
try {fis = new FileInputStream("example.txt"); // 创建文件输入流对象int content;while ((content = fis.read()) != -1) { // 逐个字节读取文件内容System.out.print((char) content); // 输出读取到的字节(转换为字符)}
} catch (IOException e) {e.printStackTrace(); // 处理异常
} finally {if (fis != null) {try {fis.close(); // 关闭流,释放资源} catch (IOException e) {e.printStackTrace(); // 处理异常}}
}
  • 字节输出流(OutputStream)

FileOutputStream:向文件中写入数据的常用类。

// 示例:使用FileOutputStream向文件写入数据
FileOutputStream fos = null;
try {fos = new FileOutputStream("output.txt"); // 创建文件输出流对象String str = "Hello, World!"; // 待写入的字符串byte[] bytes = str.getBytes(); // 将字符串转换为字节数组fos.write(bytes); // 向文件写入字节数组
} catch (IOException e) {e.printStackTrace(); // 处理异常
} finally {if (fos != null) {try {fos.close(); // 关闭流,释放资源} catch (IOException e) {e.printStackTrace(); // 处理异常}}
}

四、字符流详解

  • 字符输入流(Reader)

FileReader:从文件中读取字符数据的常用类。

// 示例:使用FileReader读取文件内容(字符方式)
FileReader fr = null;
try {fr = new FileReader("example.txt"); // 创建文件字符输入流对象int c;while ((c = fr.read()) != -1) { // 逐个字符读取文件内容System.out.print((char) c); // 输出读取到的字符}
} catch (IOException e) {e.printStackTrace(); // 处理异常
} finally {if (fr != null) {try {fr.close(); // 关闭流,释放资源} catch (IOException e) {e.printStackTrace(); // 处理异常}}
}
  • 字符输出流(Writer)

FileWriter:向文件中写入字符数据的常用类。

// 示例:使用FileWriter向文件写入数据(字符方式)
FileWriter fw = null;
try {fw = new FileWriter("output.txt"); // 创建文件字符输出流对象String str = "Hello, Character Stream!"; // 待写入的字符串fw.write(str); // 向文件写入字符串
} catch (IOException e) {e.printStackTrace(); // 处理异常
} finally {if (fw != null) {try {fw.close(); // 关闭流,释放资源} catch (IOException e) {e.printStackTrace(); // 处理异常}}
}

五、缓冲流与高效IO

为了提高IO操作的效率,Java提供了缓冲流(BufferedStream),包括BufferedInputStream、BufferedOutputStream、BufferedReader和BufferedWriter。这些缓冲流在读写操作中添加了缓冲区。

1. 缓冲输入流(BufferedInputStream)

  • 通过在内存中使用缓冲区来提高从文件中读取数据的效率。
// 示例:使用BufferedInputStream提高文件读取效率
BufferedInputStream bis = null;
try {bis = new BufferedInputStream(new FileInputStream("example.txt")); // 创建带缓冲的输入流对象int content;while ((content = bis.read()) != -1) { // 从缓冲区读取数据System.out.print((char) content); // 输出读取到的字节(转换为字符)}
} catch (IOException e) {e.printStackTrace(); // 处理异常
} finally {if (bis != null) {try {bis.close(); // 关闭流,释放资源} catch (IOException e) {e.printStackTrace(); // 处理异常}}
}

2. 缓冲输出流(BufferedOutputStream)

  • 通过缓冲区在内存中积累数据,提高写入文件的效率。
// 示例:使用BufferedOutputStream提高文件写入效率
BufferedOutputStream bos = null;
try {bos = new BufferedOutputStream(new FileOutputStream("output.txt")); // 创建带缓冲的输出流对象String str = "Hello, Buffered Output Stream!"; // 待写入的字符串byte[] bytes = str.getBytes(); // 将字符串转换为字节数组bos.write(bytes); // 向缓冲区写入数据
} catch (IOException e) {e.printStackTrace(); // 处理异常
} finally {if (bos != null) {try {bos.close(); // 关闭流,释放资源} catch (IOException e) {e.printStackTrace(); // 处理异常}}
}

3. 缓冲字符输入流(BufferedReader)

  • 通过缓存字符数据提高读取文本数据的效率。
// 示例:使用BufferedReader读取文件内容(字符方式)
BufferedReader br = null;
try {br = new BufferedReader(new FileReader("example.txt")); // 创建带缓冲的字符输入流对象String line;while ((line = br.readLine()) != null) { // 逐行读取文本数据System.out.println(line); // 输出读取到的每一行}
} catch (IOException e) {e.printStackTrace(); // 处理异常
} finally {if (br != null) {try {br.close(); // 关闭流,释放资源} catch (IOException e) {e.printStackTrace(); // 处理异常}}
}

4. 缓冲字符输出流(BufferedWriter)

  • 使用缓冲区提高写入文本数据的效率。
// 示例:使用BufferedWriter向文件写入数据(字符方式)
BufferedWriter bw = null;
try {bw = new BufferedWriter(new FileWriter("output.txt")); // 创建带缓冲的字符输出流对象String str = "Hello, Buffered Writer!"; // 待写入的字符串bw.write(str); // 向缓冲区写入数据bw.newLine(); // 添加新行bw.write("Second Line"); // 写入第二行
} catch (IOException e) {e.printStackTrace(); // 处理异常
} finally {if (bw != null) {try {bw.close(); // 关闭流,释放资源} catch (IOException e) {e.printStackTrace(); // 处理异常}}
}

六、对象流

对象流用于处理对象的序列化和反序列化,即将对象转换为字节流保存到文件中,或从字节流中恢复对象。

ObjectInputStream

反序列化对象(从字节流恢复对象)。

// 示例:使用ObjectInputStream读取对象
ObjectInputStream ois = null;
try {ois = new ObjectInputStream(new FileInputStream("object.dat")); // 创建对象输入流MyObject obj = (MyObject) ois.readObject(); // 从文件中读取对象System.out.println(obj); // 打印恢复的对象
} catch (IOException | ClassNotFoundException e) {e.printStackTrace(); // 处理异常
} finally {if (ois != null) {try {ois.close(); // 关闭流,释放资源} catch (IOException e) {e.printStackTrace(); // 处理异常}}
}

ObjectOutputStream

序列化对象(将对象写入字节流)。

// 示例:使用ObjectOutputStream写入对象
ObjectOutputStream oos = null;
try {oos = new ObjectOutputStream(new FileOutputStream("object.dat")); // 创建对象输出流MyObject obj = new MyObject(); // 创建待序列化的对象oos.writeObject(obj); // 将对象写入文件
} catch (IOException e) {e.printStackTrace(); // 处理异常
} finally {if (oos != null) {try {oos.close(); // 关闭流,释放资源} catch (IOException e) {e.printStackTrace(); // 处理异常}}
}

七、文件操作辅助类

File类

提供文件和目录的操作方法。

// 示例:使用File类进行文件操作
File file = new File("example.txt"); // 创建File对象
if (file.exists()) {System.out.println("文件存在");System.out.println("文件大小: " + file.length() + " bytes"); // 获取文件大小System.out.println("是否是文件: " + file.isFile()); // 判断是否为文件System.out.println("是否是目录: " + file.isDirectory()); // 判断是否为目录
} else {System.out.println("文件不存在");
}

Files类(Java NIO)

提供更高效的文件操作方法。

// 示例:使用Files类读取文件内容
Path path = Paths.get("example.txt"); // 创建Path对象
try {List<String> lines = Files.readAllLines(path); // 读取所有行for (String line : lines) {System.out.println(line); // 输出每一行}
} catch (IOException e) {e.printStackTrace(); // 处理异常
}

八、总结

IO流是处理数据读写的基础。Java中的IO流分为字节流和字符流,字节流适合处理各种数据类型,而字符流则专门处理文本数据。为了提高IO效率,Java提供了缓冲流。此外,对象流允许对对象进行序列化和反序列化操作。通过File类和Files类可以方便地进行文件操作。

通过掌握以上知识,你可以在实际开发中更有效地处理数据输入输出操作,优化程序性能。希望能帮助各位看官更深入理解Java IO流的使用,感谢各位看官的观看,下期见,谢谢~

相关文章:

Java 之 IO流

一、IO流概述 在计算机编程中&#xff0c;IO流&#xff08;Input/Output Stream&#xff09;是处理设备间数据传输的关键技术。简单来说&#xff0c;IO流就是以流的方式进行输入输出&#xff0c;数据被当作无结构的字节序或字符序列来处理。在Java等编程语言中&#xff0c;IO流…...

计算机毕业设计 健身房管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…...

uniapp uview扩展u-picker支持日历期间 年期间 月期间 时分期间组件

uniapp uview扩展u-picker支持日历期间 年期间 月期间 时分期间组件 日历期间、年期间、月期间及时分期间组件在不同的应用场景中发挥着重要的作用。这些组件通常用于表单、应用程序或网站中&#xff0c;以方便用户输入和选择特定的日期和时间范围。以下是这些组件的主要作用&a…...

GAMES101(10~11节,几何)

Geometry implicit隐式几何表示&#xff1a; 函数f(x,y,z)&#xff1a; 根据函数fn描述几何&#xff0c;遍历所有空间内 的点&#xff0c;如果带入xyz到函数f(x,y,z)结果0那就绘制这个点 如果xyz求值结果>0表示在几何外&#xff0c;0在表面,<0在几何内 构造几何csg(…...

家电制造的隐形守护者:矫平机确保材料完美无瑕

在家电制造业中&#xff0c;产品的美观和耐用性是消费者选择的关键因素。然而&#xff0c;在生产过程中&#xff0c;材料的翘曲问题往往成为影响产品质量的隐形杀手。幸运的是&#xff0c;矫平机的出现&#xff0c;为家电制造商提供了一个有效的解决方案&#xff0c;确保每一件…...

软件设计师考纲及笔记

1. 计算机系统知识&#xff08;分值占比&#xff1a;10%&#xff0c;重要程度&#xff1a;★★★★☆&#xff09; 1.1 计算机系统基础 计算机组成&#xff1a; 中央处理器&#xff08;CPU&#xff09;&#xff1a;计算机的核心部件&#xff0c;执行指令并处理数据。内存&…...

基于SpringCloud的微服务框架

1. 服务架构演变 1.1 单体架构 开发部署方便&#xff0c;维护扩展难。 1.2 垂直分割 将应用拆分成多个垂直部分&#xff0c;每一部分负责一组相关功能。 1.3 SOA&#xff08;Service-Oriented Architecture&#xff09; 面向服务的架构&#xff0c;引入了服务的概念。通过…...

C++速通LeetCode简单第19题-只出现一次的数字

方法一&#xff1a;暴力求解&#xff0c;排序后两个两个比较&#xff0c;两者不同时前者为答案&#xff1a; class Solution { public:int singleNumber(vector<int>& nums) {if(nums.size() 1) return nums[0];list<int> l;int ans 0;for(int i 0;i< n…...

AutoSar AP中Proxy Class中Methods描述的总结

☞ 返回总目录 5.3.6 Methods&#xff08;方法&#xff09; Proxy Class 与方法包装类 代理类与方法成员&#xff1a;对于远程服务的每种方法&#xff0c;Proxy Class 包含特定于该方法的包装类成员。例如示例中有 Calibrate、Adjust 和 LogCurrentState 三种方法对应的成员。…...

如何在本地计算机中打开远程服务器的Jupyter notebook

1. 在你的本地计算机上打开终端。 2. 使用SSH命令创建一个隧道&#xff1a; ssh -L 8888:localhost:8888 your_usernameyour_server_ip 这里&#xff0c;your_username 是你的服务器用户名&#xff0c;your_server_ip 是你的服务器IP地址。 其中&#xff0c;-L 8888:localhos…...

实习项目|苍穹外卖|day11

Apache ECharts 前端技术。 营业额统计 还是比较简单的。 用户统计 订单统计 以上所有需求。难点在于对时间类的处理&#xff1a; // 接收格式 GetMapping("/turnoverStatistics")ApiOperation("营业额统计")public Result<TurnoverReportVO>…...

easy_cloudantivirus

0x00前言 必须安装在virtualbox 攻击机&#xff1a;kali 靶机 easy_cloudantivirus 链接&#xff1a; https://www.vulnhub.com/entry/boredhackerblog-cloud-av,453/ 0x01信息搜集 经过测试发现靶场IP为192.168.56.106 进一部对IP搜集信息 发现8080端口youhttp服务。…...

python中Web API 框架

Python 中有几个非常流行的 Web API 框架&#xff0c;它们让你可以轻松地构建和部署高效的 Web API。下面我将为你介绍几个最受欢迎的 Python Web API 框架&#xff0c;及其使用方法和特点。 1. FastAPI FastAPI 是一个现代、快速&#xff08;非常高性能&#xff09;的 Web 框…...

Linux(6)--CentOS目录

文章目录 1. 根目录2. cd目录切换命令3. CentOS目录介绍4. pwd命令介绍5. ls命令介绍5.1 ls5.2 ls -a5.3 ls -l 1. 根目录 Windows电脑的根目录是计算机(我的电脑)&#xff0c;然后C盘、D盘。 Linux系统的根目录是/&#xff0c;我们可以使用cd /进入根目录&#xff0c;然后使…...

标准C++(二)

一、名字空间 什么是名字空间 在C语言中定义的全局变量、函数、结构、联合、枚举、枚举值、宏都在全局作用域下&#xff0c;所以当项目比较庞大时&#xff0c;非常容易造成命名冲突&#xff08;以模块名作前缀、后缀&#xff09;&#xff0c;所以C中选择把全局作用域进行拆分…...

硬件工程师笔试面试——保险丝

目录 10、保险丝 10.1 基础 保险丝原理图 保险丝实物图 10.1.1 概念 10.1.2 保险丝的工作原理 10.1.3 保险丝的主要类型 10.1.4 保险丝的选择和使用注意事项 10.2 相关问题 10.2.1 保险丝的额定电流和额定电压是如何确定的? 10.2.2 保险丝的熔断速度对电路保护有何…...

本地安装Ollama+WebUI

本地安装OllamaWebUI B站教程地址&#xff1a;https://www.bilibili.com/video/BV1Kz421h7Jk/?spm_id_from333.337.search-card.all.click&vd_source42b07826977d09765ec11b9fa06715e5 一、下载Ollama https://ollama.com/download 支持mac、linux、windows 选择在ubu…...

请求响应-05.请求-日期参数JSON参数

一.日期参数 当浏览器发起的请求参数类型是日期参数时&#xff0c;我们通常使用LocalDateTime对象来接收&#xff0c;前面使用DateTimeFormat注解来完成日期的格式转换&#xff08;日期时间格式有多种&#xff0c;需要哪种就设置为哪种&#xff1a;如yyyy-MM-dd HH:mm:ss&…...

CSS学习路线

CSS学习路线大全及面试常见题目可以归纳为以下几个部分&#xff1a; CSS学习路线大全 CSS基础 引入CSS的方式&#xff1a;外部样式表、内部样式表、内联样式。CSS选择器&#xff1a;包括ID选择器、类选择器、标签选择器、后代选择器、子选择器、相邻兄弟选择器、兄弟选择器、…...

Linux memcg lru lock提升锁性能

目录 内核关于per memcg lru lock的重要提交&#xff1a; 计算虚拟地址转换基本机制 问题背景 swap换入流程 时奎亮的per memcg lru lock分享视频 内核关于per memcg lru lock的重要提交&#xff1a; f9b1038ebccad354256cf84749cbc321b5347497 6168d0da2b479ce25a4647d…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...