IO流的概念

article/2025/9/15 21:58:21

IO流的概念

IO就是Input和Output的简写,也就是输入和输出的含义

IO流就是读写数据时像流水一样从一端流到另外一端,因此得名为"流"

基本分类

按照读写数据的基本单位不同,分为字节流和字符流

其中字节流主要指以字节为单位进行数据读写的流,可以读写任意类型的的文件

其中字符流主要指以字符(2个字节)为单位进行数据读写的流,只能读写文本文件。

按照读写数据的方向不同,分为输入流和输出流(站在程序的角度)

其中输入流主要指从文件中读取数据内容输入到程序中,也就是读文件

其中输出流主要指将程序中的数据内容输出到文件中,也就是写文件

按照流的角色不同分为节点流和处理流

其中节点流主要指直接喝输入输出源对接的流

其中处理流主要指需要建立在节点流的基础之上的流

体系结构

在这里插入图片描述

FileWriter类

基本概念

java.io.FileWriter类主要用于将文本内容写入到文本文件

常用的方法

方法声明功能介绍
FileWrier(String fileName)根据参数指定的文件名称构造对象
FileWriter(String fileName,boolean append)以追加的方式根据参数指定的文件名来构造对象
void write(int c)写入单个字符
void write(char[] cbuf,int off,int len)将指定字符数组中从偏移量off开始的len个字符写入此文件输出流
void write(char[] cbuf)将cbuf.length个字符从指定字符数组写入此文件输出流中
void flush()刷新流
void close()关闭流对象并释放有关的资源
Ctrl+Alt+T来生成异常的捕获代码

FileReader类

基本概念

java.io.FileReader类主要用于从文本文件读取文本数据内容

常用的方法

方法声明功能介绍
FileReader(String fileName)根据参数指定的文件名构造对象
int read()读取单个字符的数据并返回,返回-1表示读取到末尾
int read(char[] cbuf,int offset,int length)从输出流中将最多len个字符的数据读入一个字符数组中,返回读取到的字符个数,返回-1表示读取到末尾
int read(char[] cbuf)从此输入流中将最多cbuf.length个祖父的数据读入字符数组中,返回读取到的字符个数,返回-1表示读取到末尾
void close()关闭流对象并释放有关的资源

FileOutputStream类

基本概念

java.io.FileOutputStream类主要用于将图像数据之类的原始字节流写入到输出流中。

常用的方法

方法声明功能介绍
FileOutputStream(String name)根据参数指定的文件名来构造对象
FileOutputStream(String name,boolean append)以追加的方式根据参数指定的文件名来构造对象
void write(int b)将指定字节写入此文件输出流
void write(byte[] b,int off,int len)将指定字节数组中从偏移量off开始的len个字符写入此文件输出流
void write(byte[] b)将b.length个字节从指定字符数组写入此文件输出流中
void flush()刷新此输出流并强制写出任何缓冲的输出字节
void close()关闭流对象并释放有关的资源

FileInputStream类

基本概念

java.io.FileInputStream类主要用于从输入流中以字节流的方式读取图像数据等。

方式一:以单个字节为单位进行拷贝,也就是每次读取一个字节后再写入一个字节

缺点:文件稍大时,拷贝的效率很低

int res = 0 ;
while((res = fis.read()) != -1){fos.write(res);
}
方式二:准备一个和文件大小一样的缓冲区,一次性将文件中的所有内容取出到缓冲区然后一次性写入进去

缺点:若文件过大时,无法申请和文件大小一样的缓冲区,真实物理内存不足。

int len = fis.available();
System.out.println("获取到的文件大小是:"+len);
byte[] bArr = new byte[len];
int res = fis.read(bArr);
System.out.println("实际读取到的文件大小是:" + res);
fos.write(bArr);
方式三:准备一个相对适当的缓冲区,分多次将文件拷贝完成
byte[] bArr = new byte[1024];
int res = 0 ;
while ((res = fis.read(bArr)) != -1){fos.write(bArr,0,res);
}

常用的方法

方法声明功能介绍
FileInputStream(String name)根据参数指定的文件路径名来构造对象
int read()从输入流中读取单个字节的数据并返回,返回-1表示读取到末尾
int read(byte[] b,int off,int len)从此输入流中将最多len个字节的数据读入字节数组中,返回读取到的字节个数,返回-1表示读取到末尾
int read(byte[] b)从此输入流中最多b.length个字符的数据读入字节数组中,返回读取到的字符个数,返回-1表示读取到末尾
void close()关闭流对象并释放有关的资源
int available()获取输入流所关联文件的大小

BufferedOutputStream类

基本概念

java.io.BufferedOutputStream类主要用于描述缓冲流,此时不用为写入的每个字节调用底层系统。

常用的方法

方法声明
BufferedOutputStream(OutputStream out)根据参数指定的引用来构造对象
BufferedOutputStream(OutputStream out,int size)根据参数指定的引用和缓冲区大小来构造对象
void write(int b)写入单个字节
void write(byte[] b,int off, int len)写入字节数组中的一部分数据
void write(byte[] b)写入参数指定的整个字节数组
void flush()刷新流
void close()关闭流对象并释放有关的资源

BufferedInputStream类

基本概念

java.io.BufferedInputStream类主要用于描述缓冲输入流。

常用的方法

方法声明功能介绍
BufferedInputStream(InputStream in)根据参数指定的引用构造对象
BufferedInputStream(InputStream in , int size)根据参数指定的引用和缓冲区大小构造对象
int read()读取单个字节
int read(byte[] b , int off ,int len)读取len个字节
int read(byte[] b)读取b.length个字节
void close()关闭流对象并释放有关的资源

BufferedWriter类

基本概念

java.io.BufferedWriter类主要用于写入单个字符,字符数组以及字符串到输出流中。

常用的方法

方法声明功能介绍
BufferedWriter(Writer out)根据参数指定的引用来构造对象
BufferedWriter(Writer out , int size)根据参数指定的引用和缓冲区大小构造对象
void write(int c)写入单个字符到输出流中
void write(char[] cbuf,int off , int len)将字符数组cbuf中从下标off开始的len个字符写入输出流中
void write(char[] cbuf)将字符数组cbuf中所有内容写入输出流中
void write(String s , int off ,int len)将参数s中下标从off开始的len个字符写入输出流中
void write(String str)将参数指定的字符串内容写入输出流中
void newLine()用于写入行分隔符到输出流中
void flush()刷新流
void close()关闭流对象并释放有关的资源

BufferedReader类

基本概念

java.io.BufferedReader类主要用于从输入流中读取单个字符、字符数组以及字符串

常用的方法

方法声明功能介绍
BufferedReader(Reader in)根据参数指定的引用来构造对象
BufferedReader(Reader in , int size)根据参数指定的引用和缓冲区大小来构造对象
int read()从输入流读取单个字符,读取到末尾则返回-1,否杂而返回实际读取到的字符内容
int read(char[] cbuf,int off , int len)从输入流中读取len个字符放入数组cbuf中下标从off开始的位置上,若读取到末尾则返回-1,否则返回实际读取到的字符个数
int read(char[] cbuf)从输入流中读满整个数组cbuf
String readLine()读取一行字符串并返回,返回null表示读取到末尾
void close()关闭流对象病释放有关的资源

PrintStream类

基本概念

java.io.PrintStram类主要用于更加方便地打印各种数据内容

由手册可知:构造方法需要的是Reader类型的引用,但是Reader类是个抽象类,实参只能传递子类的对象
由手册可知;System.in代表键盘输入,而且是InputSteeam类型的

常用的方法

方法声明功能介绍
PrintSteam(OutputStream out)根据参数指定的引用来构造对象
void print(String s)用于将参数指定的字符串内容打印出来
void print(String x)用于打印字符串后并终止该行
void flush()刷新流
void close()用于关闭输出流并释放有关的资源

PrintWriter类

基本概念

jaba.io.PrintWriter类主要用于将对象的格式化形式打印到文本输出流

常用的方法

方法声明功能介绍
PrintWriter(Writer out)根据参数指定的引用来构造对象
void print(String s)将参数指定的字符串内容打印出来
void print(String x)打印字符串后并终止该行
void flush()刷新流
void close()关闭流对象并释放有关的资源

OutputStreamWriter类

基本概念

java.io.OutputStreamWriter类主要用于实现从字符流到字节流的转换

常用的方法

方法声明功能介绍
OutputStreamWriter(OutputStream out)根据参数指定的引用来构造对象
OutputStreamWriter(OutputStream out , String charsetName)根据参数指定的引用和编码构造对象
void write(String str)将参数指定的字符串写入
void flush()刷新流
void close()用于关闭输入流并释放有关的资源

InputStreamReader类

基本概念

java.io.InputStreamReader类主要用于实现从字节流到字符流的转换

常用的方法

方法声明功能介绍
InputStreamReader(InputStream in)根据参数指定的引用来构造对象
InputStreamReader(InputStream in , String charsetName)根据参数指定的引用和编码来构造对象
int reade(char[] cbuf)读取字符数据到参数指定的数组
void close()用于关闭输出流并释放有关的资源

字符编码

编码表的由来

计算机只能识别二进制数据,早期就是电信号,为了方便计算机可以识别各个国家的文字,就需要将各个国家的文字采用字符编号的方式进行描述并建立对应的关系表,该表就叫做编码表

常见的编码表

  • ASCII:美国标准信息交换码,使用一个字节的低7位二进制进行表示
  • ISO8859-1:拉丁码表,欧洲码表,使用一个字节的8位二进制进行表示
  • GB2312:中国的中文编码表,最多使用两个字节16位二进制进行表示
  • GBK:中国的中文编码表升级,融合了更多的中文文字符号,最多使用两个字节16位二进制进行表示
  • Unicode:国际标准码,融合了目前人类使用的所有字符,为每个字符分配唯一的字符码。所有的文字都用两个字节16位二进制来表示

编码的发展

  • 面向传输的众多UTF(UCS Transfer Format)标准出现了,UTF-8就是每次8个位传输数据,而UTF-16就是每次16个位。这是为传输而设计的编码并使编码无国界,这样就可以显示全世界上所有文化的字符了
  • Unicode只是定义了一个庞大的、全球通用的字符集,并为每个字符规定了唯一确定的编号,具体存储成什么样的字节流,取决于字符编码方案。推荐Unicode编码使UTF-8和UTf-16
  • UTF-8:变长的编码方式,可用1-4个字节来表示一个字符

DataOutputStream类

基本概念

java.io.DataOutputStream类主要用于以适当的方式将基本数据类型写入输出流中

常用的方法

方法声明功能介绍
DataOutputStream(OutputStream out)根据参数指定的引用构造对象OutputStream类是个抽象类,实参需要传递子类对象
void writeInt(int v)用于将参数指定的整数一次性写入输出流,优先写入高字节
void close()用于关闭文件输出流并释放有关的资源

DataInputStream类

基本概念

java.io.DataInputStream类主要用于从输出流中读取基本数据类型的数据

常用的方法

方法声明功能介绍
DataInputStream(InputStream in)根据参数指定的引用来构造对象,InputStream类是抽象类,实参需要传递子类对象
int readInt()用于从输出流中一次性读取一个整数数据并返回
void close()用于关闭文件输出流并释放有关的资源

ObjectOutputStream类

基本概念

  • java.io.ObjectOutputStream类主要用于将一个对象的所有内容整体写入到输出流中
  • 只能支持java.io.Serializable接口的对象写入流中
  • 类通过实现java.io.Serializable接口以启用其序列化功能
  • 所谓序列化功能主要将一个对象需要存储的相关信息有效组织形成字节序列的转化过程

常用的方法

方法声明功能介绍
ObjectOutputStream(OutputStream out)根据参数指定的引用来构造对象
void writeObject(Object obj)用于将参数指定的对象整体写入到输出流中
void close()用于关闭输出流并释放有关的资源

ObjectInputStream类

基本概念

  • java.io.ObjectInputStream类主要用于从输入流中一次性将对象整体读取出来
  • 所谓反序列化主要指将有效组织的字节序列恢复为一个对象及相关信息的转化过程

常用的方法

方法声明功能介绍
ObjectInputStream(InputStream in)根据参数指定的引用来构造对象
Object readObject()主要用于从输入流中读取一个对象并返回,无法通过返回值来判断是否读取到文件的末尾
void close()用于关闭输入流并释放有关的资源

序列化版本号

  • 序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialUID与本地相应实体类的serialUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常(InvalidCastException)

translent关键字

  • translent是Java关键字,用来表示一个域不是该对象串行化的一部分,当一个对象被串行化的时候,translent型变量的值不包括在串行化的表示中,然而非translent型的变量是被包括进去的

经验

  • 当希望多个对象写入文件时,通常建议将多个对象放入一个集合中,然后将集合这个整体看做一个对象写入输出流中,此时只需要调用一次readObject方法就可以将整个集合的数据读取出来,从而避免类通过返回值进行是否达到文件末尾的判断

RandomAccessFile类

基本概念

java.io.RandomAccessFile类主要支持对随机访问文件的读写操作

常用的方法

方法声明功能介绍
RandomAccessFile(String name , String mode)根据参数指定的名称和模式构造对象
r:以只读的方式打开
rw:打开以便读取和写入
rwd:打开以便读取和写入,同步文件内容的更新
rws:打开以便读取和写入,同步文件内容和元数据的更新
int read()读取单个字节的数据
void seek(long pos)用于设置从此文件的开头开始测量的文件指针偏移量
void write(int b)将参数指定的单个字节写入
void close()用于关闭流并释放有关的资源

http://chatgpt.dhexx.cn/article/KhbUs1F2.shtml

相关文章

什么是IO流?

大家好,我是IT修真院北京分院第27期的JAVA学员,一枚正直纯洁善良的java程序员。 今天给大家分享一下,修真院官网Java任务10,深度思考中的知识点———什么是IO流? 1.背景介绍 什么是流 流就是一系列的数据 当不同的介质之间有数据交互的时候,JAVA就使用流来实现。 数…

JavaIO流详解

转载:https://www.cnblogs.com/LittleHann/p/3678685.html Java输入、输入、IO流 类层次关系梳理 本文主要关注在Java编程中涉及到的IO相关的类库、方法。以及对各个层次(抽线、接口继承)的流之间的关系进行梳理 相关学习资料 http://baike.baidu.com/view/100795…

IO流的介绍

一:IO流的介绍 1.IO流属于一种Java技术,主要用于处理数据传输。通过IO与外界进行数据交互,通信等。 2.IO流适用于文件,图片,音乐,视频等等的传输任务。 3.通信的目标也存在多种。例如&…

最全最详细的IO流教程

前言 io流用到的地方很多,就比如上传下载,传输,设计模式等…基础打扎实了,才能玩更高端的。 在博主认为真正懂IO流的优秀程序员每次在使用IO流之前都会明确分析如下四点: (1)明确要操作的数据…

IO流详解.

目录: 一、IO流概述 二、FileInputStream初步 三、FileOutStream的使用 四、文件复制 五、FileReader的使用 六、FileWriter的使用 七、复制普通文本文件 八、带有缓冲区的字符流 九、标准输出流(掌握) / 写日志 十、File类 一、IO流概述…

IO流 (字节流、字符流)

目录 一、IO流概述 1.1 IO流概述 1.2 FileInputStream读取一个字节 1.3 FileInputStream读取多个字节 1.4 FileInputStream读取全部字节 1.5 FileOutputStream写字节 1.6 字节流复制文件 二、IO流资源释放 2.1 JDK7以前的资源释放 2.2 JDK7以后的资源释放 三、字符流…

面试官:请讲一讲IO流核心模块与基本原理是什么?

前言 一、IO流与系统 IO技术在JDK中算是极其复杂的模块,其复杂的一个关键原因就是IO操作和系统内核的关联性,另外网络编程,文件管理都依赖IO技术,而且都是编程的难点,想要整体理解IO流,先从Linux操作系统…

java IO流

目录 序 一、IO流开篇 1、概念 2、流的分类 3、IO流的作用 4、IO流的使用场景 二、字节流 1、字节流抽象基类 2、字节流写数据 (1)基本步骤 (2)三种方式 (3)两个问题 (4&#xff0…

【Java基础-3】吃透Java IO:字节流、字符流、缓冲流

Java IO流 前言1 初识Java IO1.1 IO流分类1.2 案例实操 2 IO流对象2.1 File类2.2 字节流2.3 字符流2.4 序列化 3 IO流方法3.1 字节流方法3.2 字符流方法 4 附加内容4.1 位、字节、字符4.2 IO流效率对比4.3 NIO 前言 有人曾问fastjson的作者(阿里技术专家高铁&#x…

2.2.5 操作系统之调度算法(时间片轮转调度算法、优先级调度算法、多级反馈队列调度算法)

文章目录 0.思维导图1.时间片轮转---RR2.优先级调度算法3.多级反馈队列调度算法4.三种算法的对比总结 0.思维导图 1.时间片轮转—RR Round-Robin 时间片为2举例 以时间片为5举例 可能出现的问题,比如与FCFS对比 2.优先级调度算法 非抢占式例子 - 抢占式例子 补充…

进程调度算法详解

进程调度算法 🏞️1. 调度指标🌁2. 先进先出(FIFO)🌠3. 最短作业优先(SJF)🌌4. 最短剩余时间优先(STCF)🌿5. 新度量指标:响应时间&…

《操作系统》-调度算法

调度算法 在了解调度算法之前我们先了解一下调度算法的评价指标从这几个方面入手:CPU利用率、系统吞吐量、周转时间、等待时间、响应时间 CPU利用率:指CPU“忙碌”的时间占总时间的比例 由于早期的CPU造价极其昂贵,因此人们会希望让CPU尽可…

【操作系统】-- 时间片轮转调度算法、优先级调度算法、多级反馈队列调度算法

一、时间片轮转调度算法 1、算法思想 公平地、轮流地为各个进程服务,让每个进程在一定时间间隔内都可以得到响应。 2、算法规则 按照各进程到达就绪队列的顺序,轮流让各个进程执行一个时间片,若进程未在一个时间片内执行完,则…

调度算法解析

一、常见的批处理作业调度算法 1.先来先服务调度算法(FCFS):就是按照各个作业进入系统的自然次序来调度作业。这种调度算法的优点是实现简单,公平。其缺点是没有考虑到系统中各种资源的综合使用情况,往往使短作业的用户不满意&…

进程和线程调度算法

调度算法是指:根据系统的资源分配策略所规定的资源分配算法,如任务A在执行完后,选择哪个任务来执行,使得某个因素(如进程总执行时间,或者磁盘寻道时间等)最小。对于不同的系统目标,通…

进程的调度算法

什么时候调度进程 在进程的生命周期中,当进程从一个运行状态到另外一状态变化的时候,其实会触发一次调度。 比如,以下状态的变化都会触发操作系统的调度: 从就绪态->运行态:当进程被创建时,会进入到就…

调度算法的介绍及优缺点

调度算法是根据系统的资源分配策略所规定的资源分配算法。有的调度算法适用于作业调度,有的适用于进程调度,有的两者都适用。先了解几个术语 到达时间、服务时间、开始时间 完成时间、等待时间 周转时间:完成时间-到达时间 带权周转时间&…

操作系统五种调度算法总结(含源码)

今天操作系统实验课我们做了作业调度算法的模拟。网上的调度算法参差不齐,零散杂乱。我在这里进行一个总结,并且分享给大家操作系统的五种常用算法(FCFS,SJF,HRRF,HPF,RR)并且附上代码和结果图 作业调度 作业调度又称高级调度&am…

磁盘调度算法

1 一次磁盘读/写操作需要的时间 **寻找时间(寻道时间)**Ts:在读/写数据前,需要将磁头移动到指定磁道所花费的时间。 寻道时间分两步: (1) 启动磁头臂消耗的时间:s。 (2) 移动磁头消耗的时间:假…

经典进程调度算法

介绍进程调度的概念和作用 当 CPU 有一堆任务要处理时,由于其资源有限,这些事情就没法 同时处理。这就需要确定某种规则来决定处理这些任务的顺序,这 就是 “调度” 研究的问题。除了接下来将要说的进程调度,还有 作业调度、内存…