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流概述 在计算机编程中,IO流(Input/Output Stream)是处理设备间数据传输的关键技术。简单来说,IO流就是以流的方式进行输入输出,数据被当作无结构的字节序或字符序列来处理。在Java等编程语言中,IO流…...
计算机毕业设计 健身房管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…...
uniapp uview扩展u-picker支持日历期间 年期间 月期间 时分期间组件
uniapp uview扩展u-picker支持日历期间 年期间 月期间 时分期间组件 日历期间、年期间、月期间及时分期间组件在不同的应用场景中发挥着重要的作用。这些组件通常用于表单、应用程序或网站中,以方便用户输入和选择特定的日期和时间范围。以下是这些组件的主要作用&a…...
GAMES101(10~11节,几何)
Geometry implicit隐式几何表示: 函数f(x,y,z): 根据函数fn描述几何,遍历所有空间内 的点,如果带入xyz到函数f(x,y,z)结果0那就绘制这个点 如果xyz求值结果>0表示在几何外,0在表面,<0在几何内 构造几何csg(…...
家电制造的隐形守护者:矫平机确保材料完美无瑕
在家电制造业中,产品的美观和耐用性是消费者选择的关键因素。然而,在生产过程中,材料的翘曲问题往往成为影响产品质量的隐形杀手。幸运的是,矫平机的出现,为家电制造商提供了一个有效的解决方案,确保每一件…...
软件设计师考纲及笔记
1. 计算机系统知识(分值占比:10%,重要程度:★★★★☆) 1.1 计算机系统基础 计算机组成: 中央处理器(CPU):计算机的核心部件,执行指令并处理数据。内存&…...
基于SpringCloud的微服务框架
1. 服务架构演变 1.1 单体架构 开发部署方便,维护扩展难。 1.2 垂直分割 将应用拆分成多个垂直部分,每一部分负责一组相关功能。 1.3 SOA(Service-Oriented Architecture) 面向服务的架构,引入了服务的概念。通过…...
C++速通LeetCode简单第19题-只出现一次的数字
方法一:暴力求解,排序后两个两个比较,两者不同时前者为答案: 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(方法) Proxy Class 与方法包装类 代理类与方法成员:对于远程服务的每种方法,Proxy Class 包含特定于该方法的包装类成员。例如示例中有 Calibrate、Adjust 和 LogCurrentState 三种方法对应的成员。…...
如何在本地计算机中打开远程服务器的Jupyter notebook
1. 在你的本地计算机上打开终端。 2. 使用SSH命令创建一个隧道: ssh -L 8888:localhost:8888 your_usernameyour_server_ip 这里,your_username 是你的服务器用户名,your_server_ip 是你的服务器IP地址。 其中,-L 8888:localhos…...
实习项目|苍穹外卖|day11
Apache ECharts 前端技术。 营业额统计 还是比较简单的。 用户统计 订单统计 以上所有需求。难点在于对时间类的处理: // 接收格式 GetMapping("/turnoverStatistics")ApiOperation("营业额统计")public Result<TurnoverReportVO>…...
easy_cloudantivirus
0x00前言 必须安装在virtualbox 攻击机:kali 靶机 easy_cloudantivirus 链接: https://www.vulnhub.com/entry/boredhackerblog-cloud-av,453/ 0x01信息搜集 经过测试发现靶场IP为192.168.56.106 进一部对IP搜集信息 发现8080端口youhttp服务。…...
python中Web API 框架
Python 中有几个非常流行的 Web API 框架,它们让你可以轻松地构建和部署高效的 Web API。下面我将为你介绍几个最受欢迎的 Python Web API 框架,及其使用方法和特点。 1. FastAPI FastAPI 是一个现代、快速(非常高性能)的 Web 框…...
Linux(6)--CentOS目录
文章目录 1. 根目录2. cd目录切换命令3. CentOS目录介绍4. pwd命令介绍5. ls命令介绍5.1 ls5.2 ls -a5.3 ls -l 1. 根目录 Windows电脑的根目录是计算机(我的电脑),然后C盘、D盘。 Linux系统的根目录是/,我们可以使用cd /进入根目录,然后使…...
标准C++(二)
一、名字空间 什么是名字空间 在C语言中定义的全局变量、函数、结构、联合、枚举、枚举值、宏都在全局作用域下,所以当项目比较庞大时,非常容易造成命名冲突(以模块名作前缀、后缀),所以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站教程地址: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参数
一.日期参数 当浏览器发起的请求参数类型是日期参数时,我们通常使用LocalDateTime对象来接收,前面使用DateTimeFormat注解来完成日期的格式转换(日期时间格式有多种,需要哪种就设置为哪种:如yyyy-MM-dd HH:mm:ss&…...
CSS学习路线
CSS学习路线大全及面试常见题目可以归纳为以下几个部分: CSS学习路线大全 CSS基础 引入CSS的方式:外部样式表、内部样式表、内联样式。CSS选择器:包括ID选择器、类选择器、标签选择器、后代选择器、子选择器、相邻兄弟选择器、兄弟选择器、…...
Linux memcg lru lock提升锁性能
目录 内核关于per memcg lru lock的重要提交: 计算虚拟地址转换基本机制 问题背景 swap换入流程 时奎亮的per memcg lru lock分享视频 内核关于per memcg lru lock的重要提交: f9b1038ebccad354256cf84749cbc321b5347497 6168d0da2b479ce25a4647d…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...
MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
