一文彻底搞懂IO流

文章目录

  • 1. 什么是IO流
  • 2. IO流原理
  • 3. IO流分类
    • 3.1 按数据类型分类
    • 3.2 按流的方向分类
  • 4. IO流的使用场景
  • 5. 常用的IO流类
    • 5.1 字节流类
    • 5.2 字符流类
    • 5.3 输入输出流类
    • 5.4 字符输出流类

1. 什么是IO流

Java对数据的操作是通过流的方式,IO是java中实现输入输出的基础,它可以很方便的完成数据的输入输出操作,Java把不同的输入输出抽象为流,通过流的方式允许Java程序使用相同的方式来访问不同的输入、输出。

IO又分为流IO(java.io)和块IO(java.nio),Java.io是大多数面向数据流的输入/输出类的主要软件包。此外,Java也对块传输提供支持,在核心库 java.nio中采用的便是块IO。流IO的好处是简单易用,缺点是效率较低。块IO效率很高,但编程比较复杂。

2. IO流原理

IO流是基于流的概念,它将数据的输入和输出看作是一个连续的流。数据从一个地方流向另一个地方,流的方向可以是输入(读取数据)或输出(写入数据)。Java中的IO流分为字节流和字符流两种类型,分别用于处理字节数据和字符数据。

IO流的原理是通过流的管道将数据从源头传输到目标地。源头可以是文件、网络连接、内存等,而目标地可以是文件、数据库、网络等。IO流提供了一组丰富的类和方法来实现不同类型的输入和输出操作。

3. IO流分类

Java中的IO流可以按照数据的类型和流的方向进行分类。

3.1 按数据类型分类

  • 字节流(Byte Stream):以字节为单位读写数据,适用于处理二进制数据,如图像、音频、视频等。常见的字节流类有InputStream和OutputStream。
  • 字符流(Character Stream):以字符为单位读写数据,适用于处理文本数据。字符流会自动进行字符编码和解码,可以处理多国语言字符。常见的字符流类有Reader和Writer。

在这里插入图片描述

3.2 按流的方向分类

  • 输入流(Input Stream):用于读取数据。输入流从数据源读取数据,如文件、网络连接等。常见的输入流类有FileInputStream、ByteArrayInputStream、SocketInputStream等。
  • 输出流(Output Stream):用于写入数据。输出流将数据写入到目标地,如文件、数据库、网络等。常见的输出流类有FileOutputStream、ByteArrayOutputStream、SocketOutputStream等。

4. IO流的使用场景

IO流主要用于处理输入和输出操作,适用于以下场景:

  • 读写文件:IO流可以方便地读取和写入文件中的数据,从而实现文件的读写操作,例如读取配置文件、处理日志文件、读取用户上传的文件等。
  • 网络通信:IO流可以用于处理网络通信中的数据输入和输出,例如通过Socket进行网络通信时,可以使用IO流来传输数据。
  • 数据库操作:IO流可以将数据从程序中传输到数据库中,或者从数据库中读取数据到程序中,从而实现数据库的读写操作。
  • 内存操作:IO流也可以用于处理内存中的数据输入和输出,例如通过ByteArrayInputStream和ByteArrayOutputStream可以在内存中读写数据。
  • 用户交互:IO流可以用于处理用户输入和输出,例如从控制台读取用户输入的数据,或者向控制台输出提示信息和结果。

5. 常用的IO流类

Java提供了许多IO流类来满足不同的需求,下面介绍一些常用的IO流类:

5.1 字节流类

  • InputStream:用于从输入源读取字节数据的抽象类。
  • FileInputStream:从文件中读取字节数据的类。
  • ByteArrayInputStream:从字节数组中读取字节数据的类。
  • BufferedInputStream:提供缓冲功能的字节输入流类。
  • DataInputStream:读取基本数据类型的字节输入流类。
import java.io.*;

public class ByteStreamExample {
    public static void main(String[] args) {
        try {
            // 创建一个文件输入流
            FileInputStream fis = new FileInputStream("example.txt");

            // 创建一个缓冲输入流,提高读取效率
            BufferedInputStream bis = new BufferedInputStream(fis);

            // 创建一个字节数组输出流
            ByteArrayOutputStream bos = new ByteArrayOutputStream();

            // 读取文件内容到字节数组输出流中
            int data;
            while ((data = bis.read()) != -1) {
                bos.write(data);
            }

            // 将字节数组输出流中的内容转换为字节数组
            byte[] byteArray = bos.toByteArray();

            // 打印输出字节数组内容
            System.out.println(new String(byteArray));

            // 关闭流
            bis.close();
            bos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

5.2 字符流类

  • Reader:用于从输入源读取字符数据的抽象类。
  • FileReader:从文件中读取字符数据的类。
  • BufferedReader:提供缓冲功能的字符输入流类。
  • InputStreamReader:将字节流转换为字符流的类。
import java.io.*;

public class CharacterStreamExample {
    public static void main(String[] args) {
        try {
            // 创建一个文件输入流,用于读取文件中的字符数据
            FileInputStream fis = new FileInputStream("example.txt");

            // 将字节流转换为字符流,用于读取字符数据
            InputStreamReader isr = new InputStreamReader(fis);

            // 创建一个缓冲字符输入流,提高读取效率
            BufferedReader br = new BufferedReader(isr);

            // 读取文件内容并打印输出
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }

            // 关闭流
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

5.3 输入输出流类

  • OutputStream:用于向输出目标写入字节数据的抽象类。
  • FileOutputStream:将字节数据写入文件的类。
  • ByteArrayOutputStream:将字节数据写入字节数组的类。
  • BufferedOutputStream:提供缓冲功能的字节输出流类。
  • DataOutputStream:将基本数据类型写入输出流的类。
import java.io.*;

public class OutputStreamExample {
    public static void main(String[] args) {
        try {
            // 创建一个文件输出流,用于向文件中写入字节数据
            FileOutputStream fos = new FileOutputStream("example.txt");

            // 创建一个缓冲字节输出流,提高写入效率
            BufferedOutputStream bos = new BufferedOutputStream(fos);

            // 创建一个字节数组输出流,用于将数据写入字节数组中
            ByteArrayOutputStream baos = new ByteArrayOutputStream();

            // 创建一个数据输出流,用于将基本数据类型写入输出流中
            DataOutputStream dos = new DataOutputStream(baos);

            // 写入数据到输出流中
            dos.writeInt(123);
            dos.writeDouble(3.14);
            dos.writeUTF("Hello, world!");

            // 将数据写入文件
            bos.write(baos.toByteArray());

            // 关闭流
            dos.close();
            bos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

5.4 字符输出流类

  • Writer:用于向输出目标写入字符数据的抽象类。
  • FileWriter:将字符数据写入文件的类。
  • BufferedWriter:提供缓冲功能的字符输出流类。
  • OutputStreamWriter:将字节流转换为字符流的类。
import java.io.*;

public class WriterExample {
    public static void main(String[] args) {
        try {
            // 创建一个文件输出流,用于向文件中写入字符数据
            FileWriter fw = new FileWriter("example.txt");

            // 创建一个缓冲字符输出流,提高写入效率
            BufferedWriter bw = new BufferedWriter(fw);

            // 创建一个字符数组输出流,用于将字符数据写入字符数组中
            CharArrayWriter caw = new CharArrayWriter();

            // 创建一个字符输出流,用于将字符数据写入输出流中
            PrintWriter pw = new PrintWriter(caw);

            // 写入数据到输出流中
            pw.println("Hello, world!");
            pw.println("This is a test.");

            // 将数据写入文件
            bw.write(caw.toCharArray());

            // 关闭流
            pw.close();
            bw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

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

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

相关文章

探索ChatGPT的前沿科技:解锁其在地理信息系统、气候预测、农作物生长等关键领域的创新应用

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮,可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

Java高校学校校园排课系统设计与实现(Idea+Springboot+mysql)

博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…

【wine】vb程序自定义窗口最大化崩溃分析EXCEPTION_FLT_INEXACT_RESULT 失败

故障现象,wine运行windows应用程序,点击最大化按钮崩溃,wine日志如下 02a8:err:ole:apartment_getclassobject DllGetClassObject returned error 0x80040111 for dll L"C:\\windows\\system32\\msxml2.dll" 029c:err:ole:com_get_class_obje…

蓝桥杯练习系统(算法训练)ALGO-977 P0805大数乘法

资源限制 内存限制:256.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 当两个比较大的整数相乘时,可能会出现数据溢出的情形。为避免溢出,可以采用字符串的方法来实现两个大数之间的…

C++ 哈希

目录 1. 哈希概念 2. 哈希冲突 3. 哈希函数 4. 哈希冲突解决 4.1 闭散列 4.2 开散列 4.3 对于哈希表的补充 5. 开散列与闭散列比较 6. 哈希表的模拟实现以及unorder_set和unorder_map的封装 1. 哈希概念 顺序结构以及平衡树中,元素关键码与其存储位置之间…

谷粒商城——分布式基础(全栈开发篇第一部分)

文章目录 一、服务治理网路数据支撑日志处理ELK应用监控集成工具开发工具 二、环境创建1、虚拟机创建2、虚拟机安装docker等1. 安装docker1. 配置阿里docker3.docker安装mysql错误 4、docker安装redis 3、软件1.Maven 阿里云镜像1.8jdk2、idea lombokmybatisX ,3、 …

算法之滑动窗口

题目1:209. 长度最小的子数组 - 力扣(LeetCode) 解法⼀(暴力求解): 思路: 从前往后, 枚举数组中的任意⼀个元素, 把它当成起始位置, 然后从这个起始位置开始, 然 后寻找⼀段最短的区间, 使得这段区间的和「⼤于等于」⽬标值. 将所有元素作为…

Docker容器化技术(数据卷的管理)

数据卷 是一个可供容器使用的特殊目录,它将主机操作系统目录直接 映射进容器,类似于 Linux 中的 mount 行为 。 数据卷:可以提供很多有用的特性 数据卷可以在容器之间共事和重用,容器间传递数据将变得高效与方便;对数…

二分查找【详解】

本期介绍🍖 主要介绍:二分查找的简单思路,为什么必须在有序的前提下才能使用二分查找,该怎么用C程序来实现二分查找,二分查找的局限性👀。 文章目录 1. 题目2. 思路3. 前提条件4. 编写程序 1. 题目 在一个有…

详解mfc140.dll文件,修复mfc140.dll缺失的多种方法

mfc140.dll文件是Windows操作系统中的一个非常重要的动态链接库文件。它不仅被广泛用于操作系统本身的正常运行,还被许多应用程序所依赖。 一、详解mfc140.dll文件 mfc140.dll是Microsoft Foundation Classes(MFC)库中的一个动态链接库&…

SpringBoot整合阿里云文件上传OSS以及获取oss临时访问url

SpringBoot整合阿里云文件上传OSS 1. 引入相关依赖<!--阿里云 OSS依赖--><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.10.2</version></dependency><dependen…

106. Dockerfile通过多阶段构建减小Golang镜像的大小

我们如何通过引入具有多阶段构建过程的Dockerfiles来减小Golang镜像的大小&#xff1f; 让我们从一个通用的Dockerfile开始&#xff0c;它负责处理基本的事务&#xff0c;如依赖项、构建二进制文件、声明暴露的端口等&#xff0c;以便为Go中的一个非常基础的REST API提供服务。…

常见的排序算法的时间复杂度

常见的排序算法的时间复杂度 排序算法的时间复杂度通常取决于输入数据的规模&#xff08;通常表示为n&#xff09;。以下是一些常见排序算法及其平均、最好和最坏情况下的时间复杂度&#xff1a; 1、冒泡排序&#xff08;Bubble Sort&#xff09; 平均时间复杂度&#xff1a;…

进程打开文件

目录 一、预备知识 二、操作文件函数 三、操作文件系统调用 四、理解进程打开文件 函数 vs 系统调用 open的返回值 fd 如何理解一切皆文件&#xff1f; 理解struct file 内核对象 fd的分配规则 && 重定向 理解标准错误流&#xff08;2号文件描述符&#xff0…

得帆助力大族激光主数据平台建设,用数据为企业生产力赋能

本期客户 大族激光科技产业集团股份有限公司&#xff08;以下简称“大族激光”&#xff09;是一家从事工业激光加工设备与自动化等配套设备及其关键器件的研发、生产、销售&#xff0c;激光、机器人及自动化技术在智能制造领域的系统解决方案的优质提供商&#xff0c;是国内激光…

如何通过四维轻云SDK开发打造智慧景区管理平台?

智慧景区管理平台通常是基于GIS技术&#xff0c;在三维实景地图的基础上&#xff0c;接入景区各类传感设备、第三方系统数据&#xff0c;进行业务功能的梳理及开发。但对于没有GIS开发经验的团队而言&#xff0c;地图开发具有一定的技术门槛&#xff0c;尤其是需要在前端解决好…

VR全景在智慧园区中的应用

VR全景如今以及广泛的应用于生产制造业、零售、展厅、房产等领域&#xff0c;如今720云VR全景更是在智慧园区的建设中&#xff0c;以其独特的优势&#xff0c;发挥着越来越重要的作用。VR全景作为打造智慧园区的重要角色和呈现方式已经受到了越来越多智慧园区企业的选择和应用。…

记事小本本

记事小本本 实现效果 相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</titl…

Zookeeper详解

1.Zookeeper概述 1.Zookeeper概念 Zookeeper是 Apache Hadoop 项目下的一个子项目&#xff0c;是一个树形目录服务 Zookeeper 翻译过来就是动物园管理员&#xff0c;他是用来管 Hadoop&#xff08;大象&#xff09;、Hive(蜜蜂)、Pig(小猪)的管理员。简称zk Hadoop: 存储海…

Java项目:46 ssm005基于SSM框架的购物商城系统+jsp(含文档)

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 项目是单体ssm电商水果平台&#xff0c;包括前台商城平台及后台管理系统 前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、…