【从零开始学习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流中的两大类:字节流和字符流类的使用方法,在实际的代码书写中,我们也要根据实际情况来确定哪一个更加适合。

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

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

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

相关文章

Apache+Tomcat 整合

目录 方式一:JK 1、下载安装包 2、添加依赖 3、启动服务,检查端口是否监听 4、提供apxs命令 5、检查是否确实依赖 6、编译安装 7、重要配置文件 方式二:http_proxy 方式三:ajp_proxy 方式一:JK 1、下载安装…

IDEA项目实践——动态SQL、关系映射、注解开发

系列文章目录 IDEA项目实践——创建Java项目以及创建Maven项目案例、使用数据库连接池创建项目简介 IDEWA项目实践——mybatis的一些基本原理以及案例 IDEA项目实践——动态SQL、关系映射、注解开发 IDEA创建项目的操作步骤以及在虚拟机里面创建Scala的项目简单介绍_intelli…

【计算机网络】网络基础(上)

文章目录 1. 网络发展认识协议 2.网络协议初识协议分层OSI七层模型 | TCP/IP网络传输基本流程情况1:同一个局域网(子网)数据在两台通信机器中如何流转协议报头的理解局域网通信原理(故事版本)一般原理数据碰撞结论 情况2:跨一个路由器的两个子网IP地址与…

分布式定时任务框架Quartz总结和实践(1)

一、概述 Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或…

纯css实现登录表单动效

效果图&#xff1a; 代码展示 // 我这边用的是elementUI表单校验&#xff0c;更改的样式。 <el-form:model"form":rules"rules"ref"fromList":hide-required-asterisk"true"><el-form-item prop"account"><…

记一次 .NET某医疗器械清洗系统 卡死分析

一&#xff1a;背景 1. 讲故事 前段时间协助训练营里的一位朋友分析了一个程序卡死的问题&#xff0c;回过头来看这个案例比较经典&#xff0c;这篇稍微整理一下供后来者少踩坑吧。 二&#xff1a;WinDbg 分析 1. 为什么会卡死 因为是窗体程序&#xff0c;理所当然就是看主…

回归预测 | MATLAB实现SO-CNN-BiGRU蛇群算法优化卷积双向门控循环单元多输入单输出回归预测

回归预测 | MATLAB实现SO-CNN-BiGRU蛇群算法优化卷积双向门控循环单元多输入单输出回归预测 目录 回归预测 | MATLAB实现SO-CNN-BiGRU蛇群算法优化卷积双向门控循环单元多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现SO-CNN-BiGRU蛇群算法…

14-1_Qt 5.9 C++开发指南_网络编程及主机信息查询_HostInfo

Qt 网络模块提供了用于编写 TCP/IP 客户端和服务器端程序的各种类&#xff0c;如用于 TCP 通信的QTcpSocket 和 QTcpServer&#xff0c;用于 UDP 通信的 QUdpSocket&#xff0c;还有用于实现 HTTP、FTP 等普通网络协议的高级类如 QNetworkRequest&#xff0c;QNetworkReply 和Q…

Java异常体系总结(上篇)

目录 1. 什么是异常&#xff1f; 2. 异常家族体系介绍 2.1 Error 2.2 Exception 2.2.1 运行时异常 2.2.2 编译时异常 2.2.3 Exception 分类总结 3. 从类加载的全过程深入理解编译时异常与运行时异常 3.1 类加载的全过程 3.2 什么是编译时异常&#xff1f; 3.3 什么是…

OpenCV中图像变换

一、介绍 transform()&#xff1a;Transposes a matrix. perspectiveTransform()&#xff1a;Performs the perspective matrix transformation of vectors. warpAffine()&#xff1a;Applies an affine transformation to an image. warpPerspective()&#xff1a;Applies a p…

振弦传感器信号转换器应用山体滑坡安全监测

振弦传感器信号转换器应用山体滑坡安全监测 随着人类文明的进步&#xff0c;自然灾害对人们的生活和财产安全造成的威胁也越来越大。山体滑坡作为自然灾害中的一种&#xff0c;给人们的生活和财产安全带来了极大的威胁。因此&#xff0c;进行山体滑坡的安全监测显得尤为重要。振…

标准IO和直接IO

标准IO访问方式 直接IO访问方式&#xff08;open O_DIRECT绕过内核缓冲区直接访问&#xff0c;有效避免CPU和内存多余时间的开销) 注意:直接I/0的缺点就是如果访问的数据不在应用程序缓存中&#xff0c;那么每次数据都会直接从磁盘进行加载&#xff0c;这种直接加载会非常缓慢…

Kubespray-offline v2.21.0-1 下载 Kubespray v2.22.1 离线部署 kubernetes v1.25.6

文章目录 1. 目标2. 预备条件3. vcenter 创建虚拟机4. 系统初始化4.1 配置网卡4.2 配置主机名4.3 内核参数 5. 打快照6. 安装 git7. 配置科学8. 安装 docker9. 下载介质9.1 下载安装 docker 介质9.2 下载 kubespray-offline-ansible 介质9.3 下载 kubernetes 介质 10. 搬运介质…

Selenium入门详细教程+实例演示

目录 1.Selenium概述 1.1什么是Selenium 1.2Selenium的优势 1.3Selenium WebDriver原理 2.Selenium环境搭建 3.Selenium 简单示例 4.八大元素定位 4.1定位方式 4.2定位方式的用法 5.Selenium API 5.1WebDriver 常用 API 5.2WebElement 常用 API 5.3代码示例 6.元素等待机…

DNSlog注入(利用DNSlog平台将SQL盲注变成回显注入)

前言什么是UNC什么是DNSlog注入DNSlog注入的条件防止DNSlog注入的几个措施 sqli-labs试验 前言 前几天面试的时候&#xff0c;面试官问我知不知道OOB&#xff08;带外数据&#xff09;。 当时我蒙了&#xff0c;确实没听说过这个东西&#xff0c;然后面试官告诉我原来dnslog注入…

Vue3 第一节 Vue3简介以及创建Vue3工程

1.Vue3简介以及Vue3带来了什么 2.创建Vue3.0工程并分析Vue3工程结构 3.setup函数 4.ref函数 5.reactive函数 一.Vue3简介以及Vue3带来了什么 ① Vue3简介 2020年9月18日&#xff0c;Vue.js发布3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;海贼王&#xff0…

[腾讯云Cloud Studio实战训练营]基于Cloud Studio完成图书管理系统

[腾讯云Cloud Studio实战训练营]基于Cloud Studio完成图书管理系统 ⭐前言&#x1f31c;Cloud Studio产品介绍1.登录2.创建工作空间3.工作空间界面简介4.环境的使用 ⭐实验实操&#x1f31c;Cloud Studio实现图书管理系统1.实验目的 2. 实验过程2.实验环境3.源码讲解3.1添加数据…

postgresql 使用之 存储架构 触摸真实数据的存储结构以及组织形式,存入数据库的数据原来在这里

存储架构 ​专栏内容&#xff1a; postgresql内核源码分析 手写数据库toadb 并发编程 个人主页&#xff1a;我的主页 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 概述 postgresql 数据库服务运行时&#xff0c;数据在磁…

【IMX6ULL驱动开发学习】22.IMX6ULL开发板读取ADC(以MQ-135为例)

IMX6ULL一共有两个ADC&#xff0c;每个ADC都有八个通道&#xff0c;但他们共用一个ADC控制器 1.设备树 在imx6ull.dtsi文件中已经帮我们定义好了adc1的节点部分信息 adc1: adc02198000 {compatible "fsl,imx6ul-adc", "fsl,vf610-adc";reg <0x0219…

Jenkins工具系列 —— 插件 钉钉发送消息

文章目录 安装插件 Ding TalkJenkins 配置钉钉机器人钉钉APP配置项目中启动钉钉通知功能 安装插件 Ding Talk 点击 左侧的 Manage Jenkins —> Plugins ——> 左侧的 Available plugins Jenkins 配置钉钉机器人 点击 左侧的 Manage Jenkins &#xff0c;拉到最后 钉…