关于Java输入流的学习笔记

InputStream

InputStream 就是Java标准库提供的最基本的输入流。它位于 java.io 这个包里。 java.io 包提供了所有同步IO的功能。要特别注意的一点是, InputStream 并不是一个接口,而是一个抽象类,它是所有输入流的超类。这个抽象类定义的一个最重要的方法就是 int read().这个方法会读取输入流的下一个字节,并返回字节表示的 int 值(0~255)。如果已读到末尾,返回 -1 表示不能继续读取了。

我们还要注意到在读取或写入IO流的过程中,可能会发生错误,例如,文件不存在导致无法读取,没有写权限导致写入失败,等等,这些底层错误由Java虚拟机自动封装成 IOException 异常并抛出。因此,所有与IO操作相关的代码都必须正确处理IOException

其实现类有FileInputStream、ByteArrayInputStream

缓冲

在读取流的时候,一次读取一个字节并不是最高效的方法。很多流支持一次性读取多个字节到缓冲区,对于文件和网络流来说,利用缓冲区一次性读取多个字节效率往往要高很多。 InputStream 提供了两个重载方法来支持读取多个字节:
int read(byte[] b):读取若干字节并填充到 byte[] 数组,返回读取的字节数
int read(byte[] b, int off, int len) :指定 byte[] 数组的偏移量和最大填充数

Reader

Reader是Java的IO库提供的另一个输入流接口。和 InputStream 的区别是, InputStream 是一个字节流,即以 byte 为单位读取,而Reader 是一个字符流,即以 char 为单位读取。
在这里插入图片描述

InputStreamReader

Reader 和 InputStream 有什么关系?

除了特殊的 CharArrayReader 和 StringReader ,普通的 Reader 实际上是基于 InputStream 构造的,因为 Reader 需要从 InputStream 中读入字节流( byte ),然后,根据编码设置,再转换为 char 就可以实现字符流。如果我们查看 FileReader 的源码,它在内部实际上持有一个 FileInputStream 。既然 Reader 本质上是一个基于 InputStream 的 byte 到 char 的转换器,那么,如果我们已经有一个 InputStream ,想把它转换为 Reader ,是完全可行的。 InputStreamReader 就是这样一个转换器,它可以把任何 InputStream 转换为 Reader 。

Scanner

Scanner类可以很方便地输入,它也可以设置读取的分隔符,如用.分割

scan.useDelimiter(".");
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章