【从零开始学习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…

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? 正…

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

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

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"…

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 …

就业并想要长期发展选数字后端还是ic验证?

“就业并想要长期发展选数字后端还是ic验证&#xff1f;” 这是知乎上的一个热点问题&#xff0c;浏览量达到了13,183。看来有不少同学对这个问题感到疑惑。之前更新了数字后端&数字验证的诸多文章&#xff0c;从学习到职业发展&#xff0c;都写过&#xff0c;唯一没有做过…

windows编译ncnn

官方代码https://github.com/Tencent/ncnn/wiki/how-to-build#build-for-windows-x64-using-visual-studio-community-2017 编译工具 visual studio 2017 一、编译protobuf 1、下载protobuf protobuf-3.11.2&#xff1a;https://github.com/google/protobuf/archive/v3.11…

指针初阶(超详解)

指针初阶 1.指针是什么2.指针和指针类型2.1 指针-整数2.2 指针的解引用 3.野指针3.1 野指针成因3.2如何避免野指针 4.指针运算4.1 指针-整数4.2 指针-指针4.3 指针的关系运算 5.指针和数组6.二级指针7.指针数组 1.指针是什么 指针是什么&#xff1f; 指针理解的2个要点&#xf…

maven下载按照及初次使用相关配置

maven下载按照及初次使用相关配置 一、下载 与安装 依赖Java&#xff0c;需要配置JAVA_HOME设置MAVEN自身的运行环境&#xff0c;需要配置MAVEN_HOME测试环境配置结果 MVN测试成功&#xff01;&#xff01;&#xff01; 二、本地仓库配置 Maven启动后&#xff0c;会自动保…

基于Amoeba读写分离(三十六)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 今天要学的是基于Amoeba读写分离。Amoeba是一个开源的关系型数据库管理系统&#xf…

Spark性能调优之数据序列化

前言 在使用Spark进行数据开发的时候,避不开的一个问题就是性能调优。网上一搜一大堆所谓的调优策略很多作者自己都不知所云,导致读者看了后只会更加困惑。我们在研究一个技术的时候第一手资料永远都请参考官网,官网对性能优化不一定是最全甚至最优,但是可以解决大部分问题…

向 Maven 中央仓库上传一个修改过的基于jeecg的autoPOI的 jar包记录

1、注册https://issues.sonatype.org/账号 下面就代表注册好了&#xff0c;同时提交的工单也通过了 2、这里主要是goupId 需要进行认证&#xff0c;需要到域名注册商近一个txt的解析&#xff0c;以便确保这个是你的 通过下面来验证你的域名信息&#xff0c;这里主要是上面的工…