JAVA篇:Java IO (一) 基本概念

1、Java IO 基本概念

1.1 字节流和字符流

Java IO也称为IO流,它的核心就是对文件的操作和对字节、字符类型的输入和输出流。IO是指对数据流的输入和输出,主要分为两大类:字节流和字符流。

  • 字节流:以8位(即1 byte,8 bit)作为一个数据单元,数据流中最小的数据单元是字节。

  • 字符流:以16位(即1 char,2 byte,16 bit)作为一个数据单元,数据流中最小的数据单元是字符,Java中的字符是unicode编码,一个字符占用两个字节。

字节流可以处理任何类型的数据,如图片,视频等,字符流只能处理字符类型的数据。

1.2 流式部分和非流式部分

流式部分:是IO的主体部分,流式部分根据流向分为输入流(InputStream/Reader)和输出流(OutputStream/Writer),根据数据不同的操作单元,分为字节流和字符流。再根据不同的应用场景(或功能),在这两种抽象基类上基于数据载体或功能上派生除很多子类用来满足文件、网络、管道等不同场景的IO需求,从而形成了Java的基本IO体系。

非流式部分:主要包含一些辅助流式部分的类,如SerializablePermission类、File类、RandomAccessFile类和FileDescriptor等。

1.3 节点流和处理流

java io 分类方式有很多,根据是否直接处理数据,java io又分为节点流和处理流,节点流是真正直接处理数据的,处理流是装饰加工节点流的。

节点流

  • 文件流:FileInputStream,FileOutputstream,FileReader,FlieWriter,它们都会直接操作文件,直接与OS底层交互,因此它们被称为节点流。

  • 数组流:ByteArrayInputStream, ByteArrayOutputStream, CharArrayReader, CharArrayWriter,对数组进行处理的节点流。

  • 字符串流:StringReader, StringWriter,其中StringReader能从String中读取数据并保存到char数组。

  • 管道流:PipedInputStream, PipedOutputStream, PipedReader, PipedWriter,对管道进行处理的节点流。

处理流 处理流是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写,如缓冲流BufferedReader。

处理流的构造方法综述要带一个其他流对象做参数。

常用处理流(通过关闭处理流里面的节点流来关闭处理流)

缓冲流:BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter,需要父类作为参数构造,增加缓冲功能,避免频繁读写硬盘,可以初始化缓冲数据的大小。由于带了缓冲功能,所以写数据的时候需要使用flush方法。BufferedReader提供一个readLine()方法可以读取一行,而FileInputStream和FileReader只能读取一个字节或者一个字符,因此BufferedReader也被称为行读取器。

转换流:InputStreamReader, OutPutStreamWriter,需要InputStream或OutputStream作为参数,实现从字节流到字符流的转换,我们经常读取键盘输入(System.in)或网络通信的时候,需要使用这两个类。

数据流:DataInputStream, DataOutputStream,提供将基础数据类型写入到文件中,或者读取出来。

1.4 相关

JAVA篇:Java IO (二)抽象基类InputStream、OutputStream、Reader、Writer

JAVA篇:Java IO (三)访问文件--转换流和文件流

JAVA篇:Java IO (四) 过滤流、缓冲流、推回输入流、特殊流、打印流

JAVA篇:Java IO (五) 管道流

JAVA篇:Java IO (六) 序列化及对象流

JAVA篇:Java IO (七) 字符串流和数组流

 

总结

大概是一些唠叨:

1、最开始的那张IO流的导图,可以说“一图永流传”,我在多篇博文都看到了同一张图,我之所以确认,是因为这几张图中都把字符流的CharArrayReader写成了ByteArrayReader,我只找到了CharArrayReader类,而且这个问题在某篇博文的评论下有人提出过,所以我就改了这张图。

2、字节输入流访问字符串的类StringBufferInputStream已过时,在Java API文档中说的是“已过时。 此类未能正确地将字符转换为字节。从 JDK 1.1 开始,从字符串创建流的首选方法是通过 StringReader 类进行创建。”那么为什么这个没有对应的字节输出流这个疑惑似乎就有些不必要深究了?

3、有关IO下各个流的详写,我看到有大佬Java之IO(零)总结整理了十四个点,有点犹豫要详写还是略写,要一篇写完还是分篇章,怕写着写着跟写集合一样只剩下程序性地列点了,记不住,学不到新东西还浪费时间。但是拉出源码,查看方法分别介绍的这个部分缺了,总感觉缺了很重要的东西……不过我把Java API文档放这,下次查阅的时候自己看就好了。谁也拦不住我要拆着整理!!!!!

 

参考

Java之IO(零)总结

Java 基础之详解 Java IO

Java IO学习整理

Java API文档

 

 

posted @ 2021-06-18 17:24  l.w.x  阅读(1052)  评论(0编辑  收藏  举报