【Java 基础】18 I/O流

文章目录

    • 1.基本概念
    • 2.字节流
    • 3.字符流
    • 4.标准输入输出
    • 5.最佳实践

I/O流(Input/Output 流)是计算机程序中不可或缺的一部分, 往大了说所有的操作都是IO。Java 提供了强大而灵活的 I/O 框架,支持各种数据的 读取写入操作。

1.基本概念

I/O 即 流进 和 流出

I/O 主要涉及到两个核心概念:输入(Input)和 输出(Output)。

输入,表示从外部读取数据到程序。输出,表示将程序的数据写入到外部。

比如我们写的 程序 ,执行之后将结果输出到 控制台,这就是一种我们所常见的 IO。
在这里插入图片描述

Java 将 I/O 抽象成流(Stream)的概念,流是一系列的数据元素,可以是 字节字符

2.字节流

字节流(Byte Streams): 处理原始的字节数据。InputStreamOutputStream 是字节流的基本抽象类。

FileInputStreamFileOutputStream 用于读取和写入文件的字节流。

例如:

从 input.txt 文件中读取内容,输出到控制台 并且 将内容写到一个新的文件 output.txt 中

在这里插入图片描述

示例代码:

public static void main(String[] args) {try (FileInputStream fis = new FileInputStream("C:\\tmp\\input.txt");FileOutputStream fos = new FileOutputStream("C:\\tmp\\output.txt")) {// 读取 input.txtint byteData;while ((byteData = fis.read()) != -1) {// 打印内容System.out.print((char) byteData);// 写入 output.txtfos.write(byteData);}} catch (IOException e) {e.printStackTrace();}
}

输出结果:Hello cheney

生成了 output.txt,内容:Hello cheney

ByteArrayInputStreamByteArrayOutputStream 用于读取和写入字节数组的字节流。

public static void main(String[] args) {String data = "Hello cheney";// 读取字符串byte[] dataByte = data.getBytes(StandardCharsets.UTF_8);try (ByteArrayInputStream bais = new ByteArrayInputStream(dataByte);ByteArrayOutputStream baos = new ByteArrayOutputStream()) {byte byteData;while ((byteData = (byte) bais.read()) != -1) {// 写入 ByteArrayOutputStreambaos.write(byteData);}System.out.println(baos);} catch (IOException e) {e.printStackTrace();}
}

输出结果:Hello cheney

3.字符流

字符流(Character Streams): 处理字符数据,基于 Unicode 字符集。ReaderWriter 是字符流的基本抽象类。

FileReaderFileWriter 用于读取和写入文件的字符流。

public static void main(String[] args) {try (FileReader fr = new FileReader("C:\\tmp\\input.txt");FileWriter fw = new FileWriter("C:\\tmp\\output.txt")) {// 读取 input.txtint charData;while ((charData = fr.read()) != -1) {// 打印内容System.out.print((char) charData);// 写入 output.txtfw.write(charData);}} catch (IOException e) {e.printStackTrace();}
}

输出结果:Hello cheney

FileOutputStream 一样,生成了 output.txt,内容:Hello cheney

BufferedReaderBufferedWriter 提供了缓冲区,加速字符流的读取和写入操作。

public static void main(String[] args) {String in = "C:\\tmp\\input.txt";String out = "C:\\tmp\\output.txt";try (BufferedReader reader = new BufferedReader(new FileReader(in));BufferedWriter writer = new BufferedWriter(new FileWriter(out))) {// 读取 input.txtString line;while ((line = reader.readLine()) != null) {// // 打印第一行的内容System.out.println(line);// 写入 output.txtwriter.write(line);}} catch (IOException e) {e.printStackTrace();}
}

输出结果:Hello cheney

FileOutputStream 一样,生成了 output.txt,内容:Hello cheney

4.标准输入输出

System.inSystem.out 分别代表标准输入和标准输出,可以通过 ScannerSystem.out.println 进行读取和写入。

public static void main(String[] args) {try (Scanner scanner = new Scanner(System.in)) {System.out.println("请输入: ");String input = scanner.nextLine();System.out.println("你输入了: " + input);}
}

程序运行:
在这里插入图片描述

5.最佳实践

  1. 使用 try-with-resources: 在 Java 7 引入的 try-with-resources 语句可以自动关闭实现 AutoCloseable 接口的资源,避免手动关闭资源的繁琐操作。
  2. 使用缓冲流提高性能: 使用 BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter 可以显著提高读写性能。
  3. 慎用字节流和字符流的转换: 在字符流和字节流之间进行转换时,要确保正确的字符集,以免出现乱码或数据丢失。
  4. 避免频繁的 I/O 操作: 尽量减少 I/O 操作的次数,可以通过缓存数据、合并写入等方式来提高效率。
  5. 处理异常: 在进行文件 I/O 操作时,要适时处理异常,确保程序的稳定性。
  6. 使用 NIO(New I/O): Java 提供了 NIO 包,它提供了更灵活、高效的 I/O 操作,适用于高性能的网络编程和文件处理。

Java I/O 提供了丰富的工具和类库,使得程序能够轻松地进行数据的输入和输出操作。了解各种流的特性、选择合适的类和使用最佳实践,能够编写出高效、可维护的 I/O 代码。

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

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

相关文章

45 - 多线程性能优化常见问题

1、使用系统命令查看上下文切换 上下文切换常见的监测工具 1.1、Linux 命令行工具之 vmstat 命令 vmstat 是一款指定采样周期和次数的功能性监测工具,我们可以使用它监控进程上下文切换的情况。 vmstat 1 3 命令行代表每秒收集一次性能指标,总共获取 …

【JavaSE】:String(二):深入String

深入String 一.字符串的存储二.字符串的不可变性三.字符串修改四.StringBuilder和StringBuffer 一.字符串的存储 我们知道双引号里的数据都是字符串常量,储存在字符串常量池当中。 例子 直接使用是比较地址。字符串常量池有一个特点;它会先检查该常量是否…

LLM-Intro to Large Language Models

LLM some LLM’s model and weight are not opened to user what is? Llama 270b model 2 files parameters file parameter or weight of neural networkparameter – 2bytes, float number code run parameters(inference) c or python, etcfor c, 500 lines code withou…

中介者模式 rust和java的实现

文章目录 中介者模式介绍实现javarustrust仓库 中介者模式 中介者模式(Mediator Pattern)又被称为 调停者模式 。 它定义了一个中介对象来封装一系列对象之间的交互关系。 中介者使各个对象之间不需要显式地相互引用,从而使耦合性降低&#…

计算机网络扫盲(4)——时延

一、概述 在这里,我们考虑分组交换网的情况,因特网可以被看成是一种基础设施,该基础设施为运行在端系统上的分布式应用提供服务。在理想情况下,我们希望因特网服务能够在任意两个端系统之间随心所欲地移动数据而没有任何数据地丢失…

韩语图片文字如何转为纯文本?

如何将上图为韩语的图片转为文本文件?这个需要用到OCR程序,操作方法如下: 一、打开金鸣识别网站。 二、点击“点击添加图片/PDF”,将待识别的图片添加到列表。 三、识别模块点选“通用文字”,输出格式选择“纯文本输出…

陀螺仪LSM6DSV16X与AI集成(1)----轮询获取陀螺仪数据

陀螺仪LSM6DSV16X与AI集成.1--轮询获取陀螺仪数据 概述视频教学样品申请通信模式管脚定义IIC通信模式速率生成STM32CUBEMX串口配置IIC配置CS和SA0设置串口重定向参考程序初始换管脚获取ID复位操作BDU设置设置量程和速率配置过滤链轮询读取数据主程序演示 概述 本文将介绍如何使…

PPT设置背景颜色

问题描述:PPT如何设置背景颜色? 问题解决:设计→设置背景格式→颜色→蓝色(最好选择看着比较舒服的颜色)

如何通过缺口发现短线机会?

一、认识缺口形态 新手一开始接触技术分析,可能都以为“缺口”是一个很高深的技术形态。其实缺口很简单,就是K线图中的价格空白区域,也就是股价上涨或下跌的过程中,跳过了这个价格。根据跳空的方向不同,缺口可以分为向…

AArch64中的虚拟化

运行在EL2或更高级别的软件具有对虚拟化的几个控制权限: • 第二阶段翻译(Stage 2 translation) • EL1/0指令和寄存器访问trapping • 虚拟异常生成 非安全状态和安全状态下的异常级别(ELs)如下图所示: 在…

SAP_ABAP_RZ11解决SAP运行超时问题 TIME_OUT / rdisp/scheduler/prio_high/max_runtime

SAP ABAP 顾问(开发工程师)能力模型_Terry谈企业数字化的博客-CSDN博客文章浏览阅读510次。目标:基于对SAP abap 顾问能力模型的梳理,给一年左右经验的abaper 快速成长为三年经验提供超级燃料!https://blog.csdn.net/j…

音频处理关键知识点

1 引言 现实生活中,我们听到的声音都是时间连续的,我们称为这种信号叫模拟信号。模拟信号需要进行数字化以后才能在计算机中使用。 目前我们在计算机上进行音频播放都需要依赖于音频文件。音频文件的生成过程是将声音信息采样、量化和编码产生的数字信号…

linux无网络 无ip,显示网络未连接

标题:linux无网络 无ip,显示网络未连接 参考blog:Linux无网络连接问题排查 首先我们发现ens33没有ip地址,说明这个接口并没有被分到ip; 我们可以通过手动方式来给ens33获得网络ip sudo dhclient ens33,之后再输入ifc…

FPGA UltraScale GTH 全网最细讲解,aurora 8b/10b编解码,HDMI视频传输,提供2套工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 GT 高速接口解决方案3、详细设计方案设计框图视频源选择ADV7611解码芯片配置及采集动态彩条视频数据组包UltraScale GTH 全网最细解读UltraScale GTH 基本结构参考时钟的选择和分配UltraScale GTH 发送和接收处理流程UltraScale GTH 发送…

【小沐学Python】Python实现Web服务器(Flask+celery,生产者-消费者)

文章目录 1、简介2、安装和下载2.1 flask2.2 celery2.3 redis 3、功能开发3.1 创建异步任务的方法3.1.1 使用默认的参数3.1.2 指定相关参数3.1.3 自定义Task基类 3.2 调用异步任务的方法3.2.1 app.send_task3.2.2 Task.delay3.2.3 Task.apply_async 3.3 获取任务结果和状态 4、…

用CHAT如何写教研室工作总结?

问CHAT:写一份教研室工作总结 CHAT回复:以下是一个教研室工作总结的大纳,具体内容需要根据你们教研室的实际情况进行填充和修改。 教研室XXXX年度工作总结 1. 引言:简要介绍本年度工作总结的目的和主题。 2. 教育教学工作&…

Java核心知识点整理大全24-笔记

目录 22. 数据结构 22.1.1. 栈(stack) 22.1.2. 队列(queue) 22.1.3. 链表(Link) 22.1.4. 散列表(Hash Table) 22.1.5. 排序二叉树 22.1.5.1. 插入操作 22.1.5.2. 删除操作 2…

知识点滴 - 什么是半透膜和渗透压

半透膜和渗透作用 1748年的一天,法国物理学家诺勒为了改进酒的制作水平,设计了这样一个试验:在一个玻璃圆筒中装满酒精,用猪膀胱封住,然后把圆筒全部浸在水中。当他正要做下一步的工作时,突然发现&#xff…

DDOS攻击为何永不过时?

文章目录 一、DOS二、DDOS三、如何防范DDOS 1.可以过滤IP地址2.增加设备3.在骨干节点配置防火墙4.开启过滤5.配置DNS抗攻击6.白帽团队 四、白帽子 为什么二十年前中国红客们就在用的DDOS攻击直到现在还依然是黑客们最爱的攻击方法?二十年前的攻击技术为什么还不过…

基于Java SSM框架+Vue实现教学视频点播网站项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架Vue实现教学视频点播网站演示 摘要 随着现在网络的快速发展,网上管理系统也逐渐快速发展起来,网上管理模式很快融入到了许多学院的之中,随之就产生了“视频点播系统”,这样就让视频点播系统更加方便简单。 对于…