Java中IO流的学习总结

本文详细解析了Java IO流的基本概念、体系结构及应用,包括IOStream的理解、流的体系、节点流与处理流的区别,以及如何通过简单示例来实践IO流的基本用法。强调了打牢流的基本功对于后续高级技术学习的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看完视频中关于IO流的介绍后,感觉有点晕,一是以前与IO接触的东西比较少;二是老师上来就开始讲IO的体系,四个抽象类什么的,一下我就进入了流知识的细节中了。

找了一些资料,也做了一些总结。

1.理解IOStream到底是什么。

  以前会问IO是什么,别人的解答也多是举例子:例如从硬盘上读取一个配置文件的内容到程序中,则相当于将文件的内容输入到程序内部,因此输入和“读”对 应,而将程序中的内容保存到硬盘上,则相当于将文件的内容输出到程序外部,因此输出和“写”对应。

  那么我就狭隘地以为了:IO 就是用来读写文件的。其实不然。在Java语言中,输入和输出的概念要比其它语言的输入和输出的概念涵盖的内容广泛得多,不仅包含文件的读写,也包含网络数据的发送,甚至内存数据的读写以及控制台数据的接收等都由IO来完成。

  由于在进行IO操作时,需要操作的种类很多,例如文件、内存和网络连接等,这些都被称作数据源(data source),对于不同的数据源处理的方式是不一样的,如果直接交给程序员进行处理,对于程序员来说则显得比较复杂。所以在所有的IO类设计时,在读数据时,JDK API将数据源的数据转换为一种固定的数据序列,在写数据时,将需要写的数据以一定的格式写入到数据序列,由JDK API完成将数据序列中的数据写入到对应的数据源中。这样由系统完成复杂的数据转换以及不同数据源之间的不同的变换,从而简化程序员的编码。IO的这种设计就和城市中的供水和排水系统设计是一样的,在供水的时候,水源有江河水、湖水和地下水等不同类型,由自来水公司完成把水源转换为对应的水流。而在 排水系统设计时,只需要将污水排入污水管道即可,至于这些污水是怎么被处理的,则不需要关心,这样也简化了家庭用水的处理。

  IO设计中这种数据序列被形象的称作流(Stream)。

2.IO的体系。

  在整个IO处理中,读数据的过程分为两个步骤:1、将数据源的内容转换为流结构,该步骤由JDK API完成,程序员只需要选择合适的流类型即可。2、从流中读取数据,该步骤由程序员完成,流中数据的顺序和数据源中数据的存储顺序保持一致。

  写数据的过程也分为两个步骤:1、为连接指定的数据源而建立的专门的流结构,该步骤由JDK API完成,程序员只需要选择合适的流类型即可。2、将数据以一定的格式写入到流中,该步骤由程序员完成,写入流中的数据的顺序就是数据在数据源中的存储顺序。最后,当数据写入流中以后,可以通过一定的方式把流中的数据写入数据源,或者当流被关闭时,系统会自动将流中的数据写入数据源中。

  在JDK API中,基础的IO类都位于java.io包。在实际实现时,由于JDK API历史的原因,在java.io包中又实现了两类流:字节流(byte stream)和字符流(char stream)。这两种流实现的是流中数据序列的单位,在字节流中,数据序列以byte为单位,也就是流中的数据按照一个byte一个byte的顺序实现成流,对于该类流操作的基本单位是一个byte,而对于字节流,数据序列以char为单位,也就是流中的数据按照一个char一个插入的顺序实现成流,对于该类流操作的基本单位是一个char。

所以IOStream最主要的就是四个抽象类:


视频中还提到了两个名词:节点流和处理流。这是根据功能划分的。节点流就是直接连接数据源的IO流;而处理流是指不直接连接数据源,而是建立在其它节点流对象的基础之上。马士兵老师将流比作管道。节点流就是最里层的管道,而处理流就是再套在它上面的管道,不同的管道处理不同的功能的读写操作。InputStream,OutputStream,Reader和Writer都是都是节点流。处理流中主要掌握:缓冲流,转换流,数据流,Print流和Object流。

下面我举一个简单的例子来演示一下IO流(以DataStream为例)怎么使用。

import java.io.*;
public class TestDataStream {
	public static void main(String[] args) {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();  //实例化ByteArrayOutputSteam节点流,该流可以从内存中读出字节数组。
		DataOutputStream dos = new DataOutputStream(baos);   //实例化DataOutputStream处理流,包在了节点流外面。用于对java原始的数据类型的处理。
		try{
			dos.writeDouble(Math.random()); //写入一个double类型的数据
			dos.writeBoolean(true);         //写入一个boolean类型的数据
			ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());  //实例化ByteArrayInputSteam节点流,将数据再转为字节数组读出
			System.out.println(bais.available());
			DataInputStream dis = new DataInputStream(bais);   //实例化DataInputStream处理流,再将数据处理为基本类型,然后用户输出。
			System.out.println(dis.readDouble());   //打印出这个Double类型的数据
			System.out.println(dis.readBoolean());  //打印出这个Boolean类型的数据
			dos.close();
			dis.close();
		}catch (IOException e) {
			e.printStackTrace();
		}
		
	}
}
  这个例子里有一些问题需要注意:1.流的方向:一般我们都从程序的角度看流。比如这里。先从程序向内存中写入数据,使用的OutputStream,后面使用InputStream来从内存中读入数据。2. 使用toByteArray()这个方法的是ByteArrayInputStream,不是DataOutputStream。3.这里的DataStream,因为我们常来处理基本数据。所以这个DataStream需要重点掌握。

3.总结:将流的基本功打好了,到后面的网络编程时才能更好的结合。学的过程中发现API文档在编程过程中是离不了手的。sun公司怎么定义的,只有文档最知道。


评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值