【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.txt
		int byteData;
		while ((byteData = fis.read()) != -1) {
			// 打印内容
			System.out.print((char) byteData);
			// 写入 output.txt
			fos.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) {
			// 写入 ByteArrayOutputStream
			baos.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.txt
		int charData;
		while ((charData = fr.read()) != -1) {
			// 打印内容
			System.out.print((char) charData);
            // 写入 output.txt
			fw.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.txt
		String line;
		while ((line = reader.readLine()) != null) {
			// // 打印第一行的内容
			System.out.println(line);
			// 写入 output.txt
			writer.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 代码。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络安全--网络环境构成,系统的安全

2. 网络攻防环境 目标 了解攻防环境构成了解入侵检测系统(平台)的部署位置 2.1. 环境构成 2.1.1. 环境框图 一个基本的网络攻防实验环境包括:靶机、攻击机、入侵检测分析系统、网络连接四部分组成。 一个基础的网络攻防实验环境需要如下…

Mybatis 操作续集(结合上文)

当我们增加一个数据之后,如果我们想要获取它的 Id 进行别的操作,我们该如何获取 Id 呢? 用那个Options package com.example.mybatisdemo.mapper;import com.example.mybatisdemo.model.UserInfo; import org.apache.ibatis.annotations.*;import java.util.List;Mapper pub…

Leetcode刷题详解——乘积为正数的最长子数组长度

1. 题目链接:1567. 乘积为正数的最长子数组长度 2. 题目描述: 给你一个整数数组 nums ,请你求出乘积为正数的最长子数组的长度。 一个数组的子数组是由原数组中零个或者更多个连续数字组成的数组。 请你返回乘积为正数的最长子数组长度。 示…

java面向对象 + 内存解析

这篇博客主要是重点讲解一些内存和一些规定的解释,对于定义我不会过多赘述,没有Java基础的话可以去翻看我之前的博客,学习完成之后再进行阅读。 面向对象可以说是Java中最重要的一部分了,这次复习我发现有几个点比较重要&#xf…

【Rust日报】2023-12-02 深度学习框架 Burn 发布 v0.11.0

深度学习框架 Burn 发布 v0.11.0 深度学习框架 Burn 发布 v0.11.0,新版本引入了自动内核融合(Kernel Fusion)功能,大大提升了访存密集型(memory-bound)操作的性能。同时宣布成立 Tracel AI (https://tracel…

深入理解 Kafka 集群搭建与管理

Apache Kafka 作为分布式流处理平台的核心,其集群搭建与管理是确保高可用性和高性能的关键。本文将深入研究 Kafka 集群的构建、配置、工作原理、节点角色以及一些高级管理策略,以助力读者更深层次地理解和灵活运用 Kafka 集群。 Kafka 集群基础 1 集群…

PHP开源问答网站平台源码系统 源码全部开源可二次开发 附带完整的搭建教程

目前,问答网站已经成为人们获取知识、交流思想的重要平台。然而,对于许多开发者来说,从头开始构建一个问答网站可能会面临各种挑战。今天,小编给大家介绍一款基于PHP的开源问答网站平台源码系统,它不仅源码全部开源&am…

HR看好的字符函数和字符串处理函数!!!

本篇会加入个人的所谓‘鱼式疯言’❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言,而是理解过并总结出来通俗易懂的大白话,我会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的,可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 前言 在本篇…

基于maobox-gl 纯前端绘制全球色斑图

基于maobox-gl.js、turf.js 绘制全球色斑图绘制 1、准备全球的某一类的点位数据,可以使用turf.js 随机生成点,并点数据赋properties属性 let points turf.randomPoint(30, { bbox: [-180, -90, 180, 90]}); let interpolateOptions {gridType: "…

如何在线给官网搭建一个帮助文档?

在数字化时代,帮助文档已成为官网不可或缺的一部分。然而,传统的帮助文档往往只是简单地罗列问题和答案,缺乏互动性和用户体验。那么,如何在线给官网搭建一个富有创意且用户友好的帮助文档呢? | 一、打造沉浸式体验 传…

Google Chrome访问出现 NET::ERR_CERT_INVALID

Google Chrome访问出现 NET::ERR_CERT_INVALID然后访问不了当前网站,这个是由于证书失效了,临时解决方式是: 第一种方案: 在Chrome提示“您的连接不是私密连接”页面的空白区域点击一下,然后输入“thisisunsafe”(页…

逻辑漏洞测试靶场实验

任务一: 突破功能限制漏洞,要求突破查询按钮disabled限制,获取编号:110010的查询内容(弹框中的flag) 任务二:用户信息泄露漏洞,通过回显信息,以暴力破解法方式猜测系统中…

Shell循环:expect(二)

expect实战:公钥推送 一、准备工作:安装expect,装备公钥 二、通过shell循环判断主机在线 #!/bin/bash #脚本编写 #创建一个IP地址文件 >ip.txt #使用for循环ping测试主机是否在线 for i in {3..254} do{ip192.168.151.$iping -c1 -W…

docker搭建rabbitmq、配置延迟队列插件

docker搭建rabbitmq、配置延迟队列插件 消息队列的作用:消峰、解耦、异步 rabbitmq安装 查询 [rootlocalhost ~]# docker search rabbitmq安装 [rootlocalhost ~]# docker pull rabbitmq准备工作 创建文件夹:/usr/local/software/rabbitmq/data 运…

【设计模式-4.3】行为型——责任链模式

说明:本文介绍设计模式中行为型设计模式中的,责任链模式; 审批流程 责任链模式属于行为型设计模式,关注于对象的行为。责任链模式非常典型的案例,就是审批流程的实现。如一个报销单的审批流程,根据报销单…

Android CardView基础使用

目录 一、CardView 1.1 导入material库 1.2 属性 二、使用(效果) 2.1 圆角卡片效果 2.2 阴影卡片效果 2.3 背景 2.3.1 设置卡片背景(app:cardBackgroundColor) 2.3.2 内嵌布局,给布局设置背景色 2.4 进阶版 2.4.1 带透明度 2.4.2 无透明度 一、CardView 顾名…

麒麟系统添加环境变量

环境变量添加方法 方法一:用户主目录下的.profile或.bashrc文件(推荐) 登录到你的用户(非root),在终端输入: sudo vim ~/.profile 或者 sudo vim ~/.bashrc 翻到该文件最后&#xff0c…

字符串转换整数

字符串转换整数 描述 : 请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C 中的 atoi 函数)。 函数 myAtoi(string s) 的算法如下: 读入字符串并丢弃无用的前导空格检查下一个字符&am…

[ 云计算 | AWS 实践 ] 使用 Java 检查指定的密钥是否存在于给定的 Amazon S3 存储桶中

本文收录于【#云计算入门与实践 - AWS】专栏中,收录 AWS 入门与实践相关博文。 本文同步于个人公众号:【云计算洞察】 更多关于云计算技术内容敬请关注:CSDN【#云计算入门与实践 - AWS】专栏。 本系列已更新博文: [ 云计算 | …

【C++】异常处理 ① ( 异常概念引入 | 抛出异常语法 | 捕获异常语法 | 异常捕获流程 | 异常处理代码示例 )

文章目录 一、异常处理1、异常概念引入2、抛出异常语法3、捕获异常语法4、异常捕获流程 二、异常处理代码示例1、错误代码示例 - 抛出异常 / 不捕获异常2、正确代码示例 - 抛出异常 / 捕获异常3、正确代码示例 - 抛出异常 / 捕获异常不处理继续抛出异常 一、异常处理 1、异常概…