【从零开始学习JAVA | 三十四篇】IO流

目录

前言:

IO流介绍:

IO流的常见方法:

1.字节流类:

2.字符流类:

总结:


前言:

                IO流就是存入和读取数据的解决方案,并且他是一个知识点很多的章节,因此我们关于IO流的介绍会分为多篇来进行详解,而掌握好IO流可以大大提高我们的效率,简化我们的代码执行效率。

IO流介绍:

在前文我们知道,如果我们想要实现对于程序的存档功能,就一共需要实现两个功能:

1.将数据存到文件当中,这也就是我们上一篇文章File类的作用

2.实现程序对文件数据的读取功能,这也就是我们接下来几篇所介绍的IO流的作用

在Java中,IO流(Input/Output Stream)是用于处理输入和输出的机制。它提供了读写数据的方式,允许程序与文件、网络等交互。Java中的IO流分为字节流和字符流两种类型。

字节流操作以字节为单位进行输入和输出。字节流主要由InputStream和OutputStream两个抽象类及其各种实现类组成。常见的字节流类包括FileInputStream、FileOutputStream、ByteArrayInputStream、ByteArrayOutputStream等。

字符流操作以字符为单位进行输入和输出,它可以直接操作Unicode字符。字符流主要由Reader和Writer两个抽象类及其各种实现类组成。常见的字符流类包括FileReader、FileWriter、BufferedReader、BufferedWriter等。

 字节流可以操作所有类型的文件,字符流只能操作纯文本文件。

IO流的常见方法:

1.字节流类:

1.FileOutputStream

FileOutputStream是Java IO库中用于将数据写入文件的字节输出流。它继承自OutputStream类并添加了一些特定于文件输出的方法。通过FileOutputStream,我们可以将字节数据写入本地文件,可以是单个字节,字节数组或部分字节数组。

使用FileOutputStream的基本步骤如下:

  1. 创建FileOutputStream对象:通过调用FileOutputStream的构造函数,指定要写入的文件路径和文件名称。例如:FileOutputStream fos = new FileOutputStream("file.txt");

  2. 写入数据:使用FileOutputStream提供的write()方法将数据写入文件。有多个重载的write()方法可以使用。常见的方法包括:

    • void write(int b):将指定的字节写入文件。
    • void write(byte[] b):将指定字节数组中的所有数据写入文件。
    • void write(byte[] b, int off, int len):将指定字节数组中的部分数据写入文件,参数off表示数组的起始位置,参数len表示要写入的字节数。

    例如,使用write(byte[])方法将字符串数据写入文件:

    String data = "Hello, World!";
    byte[] bytes = data.getBytes();
    fos.write(bytes);
    
  3. 刷新数据:如果需要将数据立即写入磁盘而不是等待缓冲区满或关闭流时才写入,可以调用flush()方法。例如:fos.flush();

  4. 关闭流:使用完毕后,务必关闭FileOutputStream以释放资源。可以使用close()方法关闭。例如:fos.close();

完整的示例代码如下:

import java.io.FileOutputStream;
import java.io.IOException;public class FileOutputStreamExample {public static void main(String[] args) {try {FileOutputStream fos = new FileOutputStream("file.txt");String data = "Hello, World!";byte[] bytes = data.getBytes();fos.write(bytes);fos.flush();fos.close();System.out.println("Data has been written to the file.");} catch (IOException e) {e.printStackTrace();}}
}

FileOutputStream还提供了其他一些方法,如getFD()用于获取与流关联的文件描述符,以及在特定位置写入数据的seek()方法等。

需要注意的是,使用FileOutputStream时可能会抛出IOException或FileNotFoundExceptio等异常,因此在使用时要进行适当的异常处理。

2.FileInputStream

FileInputStream是Java IO库中用于从文件中读取数据的字节输入流。它继承自InputStream类,并提供了一些特定于文件输入的方法。通过FileInputStream,我们可以从文件中读取字节数据,可以是单个字节,也可以是一组字节。

使用FileInputStream的基本步骤如下:

  1. 创建FileInputStream对象:通过调用FileInputStream的构造函数,指定要读取的文件路径和文件名称。例如:FileInputStream fis = new FileInputStream("file.txt");

  2. 读取数据:使用FileInputStream提供的read()方法来读取数据。有多个重载的read()方法可以使用。常见的方法包括:

    • int read():读取一个字节的数据并返回该字节数据的整数表示(0-255),当到达文件末尾时返回-1。
    • int read(byte[] b):从文件中读取一定数量的字节,并将其存储在指定的字节数组b中,并返回实际读取的字节数。读取到文件末尾时返回-1。
    • int read(byte[] b, int off, int len):从文件中读取最多len个字节到指定的字节数组b中,从数组的偏移量off开始,并返回实际读取的字节数。读取到文件末尾时返回-1。

    例如,使用read(byte[])方法读取文件中的数据并将其打印到控制台:

    FileInputStream fis = new FileInputStream("file.txt");
    byte[] buffer = new byte[1024];
    int bytesRead;
    while ((bytesRead = fis.read(buffer)) != -1) {System.out.write(buffer, 0, bytesRead);
    }
    
  3. 关闭流:使用完毕后,务必关闭FileInputStream以释放资源。可以使用close()方法关闭。例如:fis.close();

完整的示例代码如下:

import java.io.FileInputStream;
import java.io.IOException;public class FileInputStreamExample {public static void main(String[] args) {try {FileInputStream fis = new FileInputStream("file.txt");byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = fis.read(buffer)) != -1) {System.out.write(buffer, 0, bytesRead);}fis.close();} catch (IOException e) {e.printStackTrace();}}
}

FileInputStream还提供了其他一些方法,例如available()返回还剩下多少可读取的字节数,skip(long n)用于跳过指定数量的字节等。

需要注意的是,使用FileInputStream时可能会抛出IOException或FileNotFoundException等异常,因此在使用时要进行适当的异常处理。

2.字符流类:

字符流可以用来解决读码问题,因为汉字的编码并不是一个字节大小,而如果我们在读码的时候按照字节流进行输出的话,就会错误的把汉字编码转化成为乱码,因此我们设计了字符流,使得读码的时候不是按照字节来读取,而是字符。

在Java中,字符流类是用于读取和写入字符数据的类集合。它们都位于java.io包中,常用的字符流类包括:

  1. FileReader和FileWriter:用于读取和写入字符文件的字符流类。

    • FileReader:用于读取字符文件(如文本文件)。它以字符为单位读取文件的内容。
    • FileWriter:用于写入字符文件(如文本文件)。它以字符为单位将数据写入文件。
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;public class CharacterStreamsExample {public static void main(String[] args) {try {// 创建FileReader对象并指定要读取的文件路径FileReader reader = new FileReader("input.txt");// 创建FileWriter对象并指定要写入的文件路径FileWriter writer = new FileWriter("output.txt");int character;// 逐字符读取文件内容并写入到输出文件中while ((character = reader.read()) != -1) {writer.write(character);}// 关闭流reader.close();writer.close();System.out.println("文件复制完成!");} catch (IOException e) {e.printStackTrace();}}
}
  1. BufferedReader和BufferedWriter:提供了缓冲功能,加速字符输入输出操作。

    • BufferedReader:用于读取字符数据,并提供了缓冲功能,可以提高读取效率。
    • BufferedWriter:用于写入字符数据,并提供了缓冲功能,可以提高写入效率。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;public class BufferedCharacterStreamsExample {public static void main(String[] args) {try {// 创建BufferedReader对象并指定要读取的文件路径BufferedReader reader = new BufferedReader(new FileReader("input.txt"));// 创建BufferedWriter对象并指定要写入的文件路径BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"));String line;// 逐行读取文件内容并写入到输出文件中while ((line = reader.readLine()) != null) {writer.write(line);writer.newLine(); // 写入换行符}// 关闭流reader.close();writer.close();System.out.println("文件复制完成!");} catch (IOException e) {e.printStackTrace();}}
}
  1. InputStreamReader和OutputStreamWriter:用于处理字节流和字符流之间的转换。

    • InputStreamReader:将字节流转换为字符流。它可以指定字符集,将字节解码为字符。
    • OutputStreamWriter:将字符流转换为字节流。它可以指定字符集,将字符编码为字节。
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;public class EncodingExample {public static void main(String[] args) {try {// 使用InputStreamReader将字节流转换为字符流FileInputStream fis = new FileInputStream("input.txt");InputStreamReader reader = new InputStreamReader(fis, "UTF-8");int data;while ((data = reader.read()) != -1) {System.out.print((char) data);}reader.close();// 使用OutputStreamWriter将字符流转换为字节流FileOutputStream fos = new FileOutputStream("output.txt");OutputStreamWriter writer = new OutputStreamWriter(fos, "UTF-8");writer.write("你好,世界!");writer.close();} catch (IOException e) {e.printStackTrace();}}
}

总结:

        本文我们介绍了IO流中的两大类:字节流和字符流类的使用方法,在实际的代码书写中,我们也要根据实际情况来确定哪一个更加适合。

如果我的内容对你有帮助,请点赞,评论,收藏创作不易,大家的支持就是我坚持下去的动力!

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

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

相关文章

Jmeter —— jmeter接口自动化测试操作流程

在企业使用jmeter开展实际的接口自动化测试工具,建议按如下操作流程, 可以使整个接口测试过程更规范,更有效。 接口自动化的流程: 1、获取到接口文档:swagger、word、excel ... 2、熟悉接口文档然后设计测试用例&am…

ES开启身份认证

文章目录 X-Pack简介之前的安全方案ES开启认证ES服务升级https协议开启集群节点之间的证书认证 X-Pack简介 X-Pack是Elastic Stack扩展功能,提供安全性,警报,监视,报告,机器学习和许多其他功能。 X-Pack的发展演变&am…

html刷新图片

文章目录 前言网页整体刷新改变图像的url 备注 前言 海思3516的一个开发板,不断的采集图像编码为jpeg,保存为同一个文件。打算用网页实现查看视频的效果,需要前端能够自动刷新。 目前找到了两个方法,一个是网页的不断刷新&#…

Pytest学习教程_测试报告生成pytest-html(三)

前言 pytest-html 是一个用于生成漂亮的 HTML 测试报告的 pytest 插件。它可以方便地将 pytest 运行的测试结果转换为易于阅读和理解的 HTML 报告,提供了丰富的测试结果展示功能和交互性。 一、安装 # 版本查看命令 pytest版本: pytest --version pyte…

VGN N75pro说明书

VGN N75pro说明书 1、封面和最后一页 2、第01、02、03 3、第04 4、第05

面试总结-Redis篇章(十)——Redis哨兵模式、集群脑裂

Redis哨兵模式、集群脑裂 哨兵模式哨兵的作用服务状态监控 Redis集群(哨兵模式)脑裂解决办法 哨兵模式 为了保证Redis的高可用,Redis提供了哨兵模式 哨兵的作用 服务状态监控 Redis集群(哨兵模式)脑裂 假设由于网络原…

344.翻转字符串+387.字符串中的第一个唯一字符

目录 一、翻转字符串 二、字符串中的第一个唯一字符 一、翻转字符串 344. 反转字符串 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:void reverseString(vector<char>& s) {int start0;int end s.size()-1;while(start < end){swap(s[sta…

3ds MAX 绘制喷泉

首先绘制一个小圆柱体当做喷头&#xff1a; 在粒子系统内选择【超级喷射】&#xff0c;并设置对应的参数&#xff1a; 轴和平面的扩散代表了我们看到的水柱能占据多大的面积 另外比较重要的参数是粒子运动和粒子计时 前者是粒子移动的时间也就是喷射的速度 后者代表了喷射出的…

构建语言模型:BERT 分步实施指南

学习目标 了解 BERT 的架构和组件。了解 BERT 输入所需的预处理步骤以及如何处理不同的输入序列长度。获得使用 TensorFlow 或 PyTorch 等流行机器学习框架实施 BERT 的实践知识。了解如何针对特定下游任务(例如文本分类或命名实体识别)微调 BERT。为什么我们需要 BERT? 正…

数学建模常见模型汇总

优化问题 线性规划、半定规划、几何规划、非线性规划、整数规划、多目标规划(分层序列法)、动态规划、存贮论、代理模型、响应面分析法、列生成算法 预测模型 微分方程、小波分析、回归分析、灰色预测、马尔可夫预测、时间序列分析(AR MAMA.RMA ARTMA LSTM神经网络)、混沌模…

【VTK】基于读取出来的 STL 模型,当用户点击鼠标左键时,程序将获取点击位置的点,显示其坐标,并设置它为模型的旋转原点

知识不是单独的&#xff0c;一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏&#xff1a;Visual Studio。 文章目录 class PointPickedSignal : public QObjectclass MouseInteractorCommand : public vtkCommandvoid A::on_pushButtonSelected_clicked()void A::on…

2023年华数杯数学建模D题思路分析

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor 1 竞赛信息 为了培养学生的创新意识及运用数…

Linux vi/vim以及三种模式常用快捷键

vi/vim vi和vimvi 命令模式vi 插入模式vi 底行模式 vi和vim vi 和 vim 都是在 Linux 系统中的文本编辑器。vim 实际上是 vi 的增强版&#xff0c;提供了更多的功能和改进。 vi&#xff1a; vi 是一个经典的文本编辑器&#xff0c;几乎在每个 Linux 发行版中都预装了。vi 的使用…

算法专题:子序列系列2(回文)

文章目录 示例1&#xff1a;回文子串思路DP数组含义&#xff08;注意&#xff09;递推公式初始化遍历顺序&#xff08;注意&#xff09; 完整版注意点 示例2&#xff1a;最长回文子序列思路DP数组含义递推公式初始化遍历顺序 完整版注意点另一种写法不能把DP数组全部初始化为1的…

【pandas使用小技巧】如何将DataFrame的index有序化【reset_index()方法】

在pandas中&#xff0c;可以使用**reset_index()**方法将DataFrame的index改成连续的。reset_index()方法会将原来的index作为一列新的数据添加到DataFrame中&#xff0c;并将新的index设置为连续的整数。栗子如下&#xff0c;演示如何使用reset_index()方法将DataFrame的index…

vue3搭建(vite+create-vue)

目录 前提条件 输入命令 对于Add an End-to-End Testing Solution nightwatch和Cypress 和 Playwright 运行 前提条件 熟悉命令行已安装 16.0 或更高版本的 Node.js &#xff08;node -v查看版本&#xff09; 输入命令 npm init vuelatest 这一指令将会安装并执行 create-…

Meta AI研究团队新AI模型: Llama 2 大语言模型

Llama是Facebook Research团队开发的基础语言模型集&#xff0c;旨在提供广泛的语言理解能力。它基于转换器架构&#xff0c;参数范围从7B到65B。通过使用Llama模型&#xff0c;研究人员和开发人员可以构建更先进的自然语言处理系统。您可以在GitHub上找到相关的代码和资源&…

kotlin 编写一个简单的天气预报app(四)增加界面显示

编写界面来显示返回的数据 用户友好性&#xff1a;通过界面设计和用户体验优化&#xff0c;可以使天气信息更易读、易理解和易操作。有效的界面设计可以提高用户满意度并提供更好的交互体验。 增加城市名字的TextView <TextViewandroid:id"id/textViewCityName"…

web基础与http协议

dns域名&#xff1a;网络是基于tcp/ip协议进行通信和连接的 ip地址&#xff1a;每一台主机都是有一个唯一的地址标识&#xff08;固定的ip地址&#xff09; 作用&#xff1a;1、区分用户和计算机 2、通信 ip地址的问题&#xff1a;由32位二进制数组成&#xff0c;不方便记忆…

CentOS 7虚拟机 虚拟机安装安装增强VBox_GAs_6.1.22失败:modprobe vboxguest failed

我安装的CentOS 在安装增强工具的时候报错: 查阅资料后 &#xff0c;解决方法&#xff1a; 1、更新kernel内核版本&#xff1a; yum update kernel -y //安装kernel-devel和gcc编译工具链yum install -y kernel-devel gcc//更新kernel和kernel-devel到最新版本yum -y upgrade …