2021-01-22

本文介绍了Java I/O的基本概念,包括数据流分类、字节流与字符流的区别、节点流与过滤流的应用,以及标准输入输出流、序列化流和处理流的使用技巧。重点讲解了装饰者模式在IO流中的应用,帮助理解文件操作和字符编码问题。
摘要由CSDN通过智能技术生成

菜鸟教程:https://www.runoob.com/java/java-files-io.html

ps:本文主要总结i/o常用的概念体系,部分具体实现没有实现,如果要看具体实现代码。建议查看菜鸟教程以及java的API文档。
I/O
Java把这些不同来源和目标的数据都统一抽象为数据流。Java语言的输入输出功能是十分强大而灵活的,美中不足的是看上去输入输出的代码并不是很简洁,因为你往往需要包装许多不同的对象。
在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:标准输入输出,文件的操作,网络上的数据流,字符串流,对象流,zip文件流。

Java流的分类
按流向分:
输入流: 程序可以从中读取数据的流。
输出流: 程序能向其中写入数据的流。

按数据传输单位分:
字节流: 以字节为单位传输数据的流

按功能分:

节点流: 用于直接操作目标设备的流
过滤流: 是对一个已存在的流的链接和封装,通过对数据进行处理为程序提供功能强大、灵活的读写功能。

java.io常用类:
JDK所提供的所有流类位于java.io包中,都分别继承自以下四种抽象流类:

InputStream:继承自InputStream的流都是用于向程序中输入数据的,且数据单位都是字节(8位)。
OutputSteam:继承自OutputStream的流都是程序用于向外输出数据的,且数据单位都是字节(8位)。
Reader:继承自Reader的流都是用于向程序中输入数据的,且数据单位都是字符(16位)。
Writer:继承自Writer的流都是程序用于向外输出数据的,且数据单位都是字符(16位)。

在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:标准输入输出,文件的操作,网络上的数据流,字符串流,对象流,zip文件流…本文的目的是为大家做一个简要的介绍。

图形理解输入输出流:
在这里插入图片描述

字节流与字符流的区别
(1)字节流
表示以字节为单位从stream中读取或往stream中写入信息,即io包中的inputstream类和outputstream类的派生类。通常用来读取二进制数据,如图象和声音。
(1)字符流
  以Unicode字符为导向的stream,表示以Unicode字符为单位从stream中读取或往stream中写入信息。
区别:
  Reader和Writer要解决的,最主要的问题就是国际化。原先的I/O类库只支持8位的字节流,因此不可能很好地处理16位的Unicode字符流。Unicode是国际化的字符集(更何况Java内置的char就是16位的Unicode字符),这样加了Reader和Writer之后,所有的I/O就都支持Unicode了。此外新类库的性能也比旧的好。
但是,Read和Write并不是取代InputStream和OutputStream,有时,你还必须同时使用"基于byte的类"和"基于字符的类"。为此,它还提供了两个"适配器(adapter)"类。InputStreamReader负责将InputStream转化成Reader,而OutputStreamWriter则将OutputStream转化成Writer。

节点流和过滤流:
节点流是从特定的地方读写的流,例如磁盘或者内存空间,也就是这种流是直接对接目标的。
过滤流是使用节点流作为输入输出的,就是在节点流的基础上进行包装,新增一些特定的功能。

如何区分处理流和节点流
例如:
BufferedReader reader = new BufferedReader(new FileReader(“E:\eclipse\IOFile\src\test1\test1.java”));
BufferedReader:处理流
FileReader:节点流

序列化流:
SequenceInputStream。(继承自InputStream)
使用对象流需要实现Serializable接口,否则会报错。而若用transient关键字修饰成员变量,不写入该成员变量,若是引用类型的成员变量为null,值类型的成员变量为0.
.Java IO是采用的是装饰模式,即采用处理流来包装节点流的方式,来达到代码通用性。
2.处理流和节点流的区分方法,节点流在新建时需要一个数据源(文件、网络)作为参数,而处理流需要一个节点流作为参数。
3.处理流的作用就是提高代码通用性,编写代码的便捷性,提高性能。
4.节点流都是对应抽象基类的实现类,它们都实现了抽象基类的基础读写方法。其中read()方法如果返回-1,代表已经读到数据源末尾。

标准输入输出流:
System.in System.out 通常用于键盘输入输出时使用,
重点方法:可用于数组复制与扩容
System.arraycopy(src, srcPos, dest, destPos, length);

字节流解决乱码:(纯文本建议使用字符流处理)
在这里插入图片描述

文件目录检索见菜鸟教程:
https://www.runoob.com/java/java-files-io.html

scaner类:

注意:()
使用输出流写入文件时,new输出对象时,注意是否要覆盖文本内容,
BufferedWriter out = new BufferedWriter(new FileWriter("./aaa.txt", true));
// true 不要时默认覆盖上一次写入的内容

在最底层,所有的输入/输出都是字节形式的,基于字符的流只在处理字符的时候提供方便有效的方法。-----------------------必须懂:装饰者模式

Flieinputstream本地方法实现read0()

bufferdReader:小数组容量:8192 使用同步关键字 synchronized (lock)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值