当前位置: 首页 > 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…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...