Java读写IO流详解

article/2025/9/15 22:05:31

一、IO流要明确的几点

(1)明确要操作的数据是数据源还是数据目的(是读还是写)

        源/读

        InputStream    Reader

        目的/写

        OutputStream        Writer

(2)明确操作设备上的数据是字节还是文本

        源/读

        字节:InputStream

        文本:Reader

        目的/写

        字节:OutputStream

        文本:Writer

(3)明确数据所在具体地点

        设备:

        硬盘:文件File开头

        内存:数组、字符串

        硬盘:System.in

        网络:Socket

        对应目的地的设备

        硬盘:文件File开头

        内存:数组、字符串

        硬盘:System.out

        网络:Socket

(4)明确是否需要额外功能

        需要转换——转换流 InputStreamReader、OutputStreamWtiter

        需要高效率——缓冲流 Bufferedxxx

       对象序列化——ObjectInputStream、ObjectOutputStream

IO流主要分类:

二、File概述

 至于IO流,也就是输入输出流,从文件出发到文件结束,至始至终都离不开文件,所以IO流先从文件File类讲起。

File跟流无关,File类不能对文件进行读和写也就是输入和输出!
File主要表示类似D:\\文件目录1D:\\文件目录1\\文件.txt,前者是文件夹(Directory)后者则是文件(file),而File类就是操作这两者的类。

2.1  常用方法(建议熟记)

绝对路径:一个完整的路径,以盘符开头,例如  F://Java//aaa//b.txt。也可以用单斜杠 /
相对路径:一个简化的路径,不以盘符开头,例如  //aaa//b.txt。也可以用单斜杠 /

以上方方法测试,代码如下【注意测试以自己的电脑文件夹为准】:

public class Test {public void creat(File file)throws Exception{if (!file.exists());//判断文件是否存在file.createNewFile();//创建新的文件}public void show(File file){if (file.exists()){//如果文件存在if (file.isFile()){//如果是文件 输出文件信息System.out.println("文件名称:"+file.getName());//文件名//文件绝对路径System.out.println("文件绝对路径:"+file.getAbsolutePath());System.out.println("文件相对路径:"+file.getPath());//相对路径System.out.println("文件大小:"+file.length());//文件字节大小}if (file.isDirectory()){//测试文件是否是目录System.out.println("此文件是目录");}}else{System.out.println("此文件不存在");}}public void delete(File file){if (file.exists()){//如果文件存在file.delete();//删除文件System.out.println("文件已删除");}}public static void main(String[] args)throws Exception {File file=new File("a.txt");//文件名Test te=new Test();//创建对象  调动方法te.creat(file);//创建文件方法te.show(file);// 展示文件信息方法}
}

2.2文件目录创建事项

1.如果目录可达,可以直接用 createNewFile() 创建文件,也可用 mkdir() 创建目录

2.如果父级目录不存在,需要先用getParentFile() 获取父级File对象,用父级对象 .mkdirs() 可以递归创建全部的父级目录

文件File的操作

:createNewFile()     mkdir()     mkdirs()

: delete()     deleteOnExit()

: renameTo()

: getName()    getPath()    getAbsolutePath()     getParentFile()     list()     liftFiles()

三、IO流的定义

        读文件是指把文件中的数据读取到内存中。反之,写文件就是把内存中的数据写到文件中,那通过什么读写文件呢?答案就是

        流是指一连串流动的字符,是以先进先出的方式发送和接收数据的通道

我们把这种数据的传输,可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为输入input 和输出output ,即流向内存是输入流流出内存的输出流

Java中I/O操作主要是指使用 java.io 包下的内容,进行输入、输出操作。输入也叫做读取数据输出也叫做作写出数据

1.1 IO的分类
根据数据的流向分为:输入流 输出流。

划分流的方式:按流向区分、按处理数据单元划分

1.流向区分:输出流:OutputStream 和 Writer作为基类

输入流:InputStream 和 Reader作为基类

2.处理数据单元划分: 字节流:字节输入流InputStream基类

字节输出流OutputStream基类

字符流:字符输入流Reader基类

字符输出流Writer基类

字节流是8位通用字节流,字符流是16位 Unicode 字符流

四、字节流

        字节输入流的基本方法:

        InputStream常用方法:抽象类---基类 (读)

1、 public void close() :关闭此输出流并释放与此流相关联的任何系统资源。

2、int available():可以从输入流中读取的字节数目

3、int read():从输入流一个字节一个字节的读,返回的是该字节的整数表示形式,如果读到了输入流的末尾,返回-1
4、int read(byte[ ] b):从输入流读取若干字节,把这些字节保存到数组b中,返回的是读取的字节数,如果读到了输入流的末尾,返回-1
5、int read(byte[ ] b,int off,int len):从输入流读取若干字节,把这些字节保存到数组b中,off指的是字节数组中开始保存数据的起始下标;len 指定读取的字节数目。如果读到了输入流的末尾,返回-1

使用步骤:

1.引入相关的类

2.构造文件输入流 FileInputStream 对象

3.读取文本文件的数据

4.关闭文件流对象

不抛出异常的方法:try catch

 

抛出异常的方法:throws IOException

OutputStream字节输出流(抽象类---基类) (写)

常用方法:

1、void write(int c): 往输出流中写入一个一个的字节

2、void write(byte[ ] buf): 往输出流中写入一个字节数组

3、void write(byte[ ] b,int off,int len): 往输出流中写入一个字节数组,off代表开始从字节数组的off位置开始往外写,len代表往外写len长度的字节

4、void colse(): 关闭输出流

5、void flush(): 强制把缓冲区的数据写到输出流中

FileOutputStream创建构造方法:

FileOutputStream(File file)

FileOutputStream(Stream name)

FileOutputStream(Stream name,boolean append) 可以在末尾追加内容

前两种构造方法在向文件写数据时将覆盖文件原有内容

创建FileOutputStream实例时,如果相应的文件不存在,则会自动创建一个空的文件

使用步骤:

1.引入相关的类

2.构造文件输出流 FileOutputStream对象

3.把数据写入文本文件

4.关闭文件流对象

不抛出异常的方法:try catch

抛出异常的方法:throws IOException

五、字符流

字符流的由来:因为数据编码的不同,因而有了对字符进行高效操作的流对象,字符流本质其实就是基于字节流读取时,去查了指定的码表,而字节流直接读取数据会有乱码的问题(读中文会乱码)

大纲:

字符输入流(Reader):1.FileReader 、 2. InputStreamReader(解决中文乱码) 、 3.BufferedReader(提高效率)、4.BufferedReader读取包含中文的文件文本时,需要使用InputStreamReader

字符输出流(Writer):1.FielWrtier 、 2. Writer 子类 OutputStreamWriter(解决中文乱码) 、 3.BufferedWriter(提高效率)

1.1

字符输入流(Reader)

以Reader为基类 FileReader,Reader的常用方法以及作用,字符流FileReader的创建方式

1、public void close() :关闭此流并释放与此流相关联的任何系统资源。
2、 public int read(): 从输入流读取一个字符。
3、 public int read(char[ ] cbuf): 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中

FileReader类是Reader的孙子类,new FileReader类对象变成实际的字符输入流对象,从而对文件操作

1、FileReader(File file): 创建一个新的 FileReader ,给定要读取的File对象。
2、 FileReader(String fileName): 创建一个新的 FileReader ,给定要读取的文件的字符串名称。

FileReader读取文件流程

1.引入资源 IO流包

2.创建FileReader对象

3.调用相应read()读取文件

4.关闭字符流

1.2

中文乱码原因:文件与环境编码不一致

获取本地平台的编码:

System.out.println(System.getProperty("file.encoding"));

        字符存入文件是按照字符编码格式编码后存储的

解决方案:(把一个字节流包成一个字符流,同时指定编码格式)

1.手动调整文件编码格式与程序环境编码一致,弊端:可能会导致代码乱码

2.使用Reader子类 InputStreamReader

① InputStreamReader(InputStream in)

②InputStreamReader(InputStream in,Stream charsetName)

Stream charsetName:字符编码格式

BufferedReader类:提高字符流读取文本文件的效率

常用构造方法:BufferedReader(Reader in)

子类BuferedReader特有方法: readLine()

BufferedReader读取包含中文的文件文本时,需要使用 InputStreamReader

示例代码:

1.3 字符输出流 Writer及其子类

Writer常用方法其作用 FileWrtier 构建及使用 OutputStreamWriter 解决中文乱码

Writer类常用方法:

1、void write(int c)         写入单个字符。
2、void write(char[ ] cbuf)        写入字符数组。
3、void write(char[ ] cbuf, int off, int len)写入字符数组的某一部分,off数组的开始索引,len写的字符个数。
4、 void write(String str)写入字符串。
5、void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个数。
6、void flush( ) 刷新该流的缓冲。
7、void close() 关闭此流,但要先刷新它。

FileWriter类是Writer的孙子类

覆盖原有内容:

FileWriter(File file)

FileWrtier(String name)

boolean类型的参数构造方法

FileWriter类只能按照本地平台的字符编码来写数据,用户不能指定其他的字符编码类型

解决办法: Writer 子类 OutputStreamWriter 的常用构造方法

OutputStreamWriter(OutputStream out)

OutputStreamWriter(OutputStream out,Stream charsetName)

BufferedWriter类 和 BufferedReader类一样

提高字符流写文本文件的效率

BufferedWriter类是Writer类的子类

BufferedWriter类带有缓冲区

常用构造方法: BufferedWrtier(Wtiter out)

六、对象流 (序列化、反序列化)

        序列化:简单的说序列化就是将对象的状态存储到特定存储介质中的过程,也就是将对象状态转换为可保存或可传输格式的过程。

        反序列化:顾名思义就是与序列化相反,序列化是将对象的状态信息保存到存储介质中,反序列化则是从特定存储介质中读取数据并重新构建成对象的过程

序列化过程:

        1.创建一个对象  输出流 ObjectOutputStream ,它可以包装一个其他类型的输出流,如文件输出流 FileOutputStream

        2.通过对象输出流的 writeObject()方法写对象,也就是输出可序列化对象。

反序列化过程:

        1.创建一个对象  输入流 ObjectInputStream ,它可以包装一个其他类型的输入流,如文件输入流 FileInputStream

        2.通过对象输入流的 readObject()方法读取对象,该方法返回一个 Object 类型的对象,如果程序知道该 Java 对象的类型,则可以将该对象强制转换成其真实的类型。


http://chatgpt.dhexx.cn/article/2RjSZPxS.shtml

相关文章

python IO流

python io流 总的来说就说计算机输入和输出的操作,一般来说是内存与磁盘之间的输入输出 一种虚拟世界的物质。 IO流操作是一种持久化操作,是将数据持久化在磁盘上。 这里用了open函数 函数的第一个引号内放的是运行的python文件目录下的一个名为1.txt的…

IO流的概念

IO流的概念 IO就是Input和Output的简写,也就是输入和输出的含义 IO流就是读写数据时像流水一样从一端流到另外一端,因此得名为"流" 基本分类 按照读写数据的基本单位不同,分为字节流和字符流 其中字节流主要指以字节为单位进行…

什么是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…