细数常见的8个java输入字节流

1.InputStream根接口

2.ByteArrayInputStream

ByteArrayInputStream把字节数组中的字节以流的形式读出。把内存中的数据读到字节数组中,而ByteArrayInputStream又把字节数组中的字节以流的形式读出,实现了对同一个字节数组的操作.

ByteArrayInputStream相对于ByteArrayOutputStream的(可以将程序中的数据读到自己内置的大小任意的缓冲区中,再写到一个Byte数组中)功能,显得比较鸡肋,在JDK介绍文档中介绍的都比较少(将字节数组中的数据,读到流中的缓冲区中,再反馈给程序)该缓冲区中包含从流中读取的字节。内部计数器跟踪read方法要提供的下一个字节。关闭ByteArrayInputStream无效(ByteArrayOutputStream相同)此类中的方法,在关闭此流之后,仍可以被调用,而不会产生IOException。

3.FileInputStream文件输入流

三个核心方法,也就是Override(重写)了抽象类InputStream的read方法。intread() 方法,即:

3.1 publicint read() throws IOException

代码实现中很简单,一个try中调用本地native的read0()方法,直接从文件输入流中读取一个字节。IoTrace.fileReadEnd(),字面意思是防止文件没有关闭读的通道,导致读文件失败,一直开着读的通道,会造成内存泄露。

3.2 int read(byte b[]) 方法,即

public int read(byte b[]) throws IOException

代码实现也是比较简单的,也是一个try中调用本地native的readBytes()方法,直接从文件输入流中读取最多b.length个字节到byte数组b中。

3.3 int read(byte b[], int off, int len) 方法,即

public int read(byte b[], int off, int len) throwsIOException

代码实现和 int read(byte b[])方法一样,直接从文件输入流中读取最多len个字节到byte数组b中。

FilterInputStream

FilterInputStream被protected修饰,不能创建对象。

只能使用其子类

protected

FilterInputStream(InputStream in)

将参数 in 分配给字段 this.in,以便记住它供以后使用,通过这种方式创建一个 FilterInputStream。

此类中的InputStream,在构造的时候,都必须放入其它的InputStream,相当于包装的作用,包装之后,显示出来的特性各不相同。

4.BufferedInputStream

带缓冲的输入流,有两个重要的构造方法:

4.1 BufferedInputStream(InputStream in)

创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。

4.2 BufferedInputStream(InputStream in, int size)

创建具有指定缓冲区大小的 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。

将FileInputStream包装起来,相当于将FileInputStream装到一个缓冲区Buffer中,提高了字节流读取的速度:

BufferedInputStreamin = new BufferedInputStream(new FileInputStream(“Test”));

5. DataInputStream 二进制输入流

DataInputStream(InputStream in)

使用指定的底层 InputStream 创建一个DataInputStream。

DataInputStream实现了DataInput接口

DataInputStream能以一种与机器无关(当前操作系统等)的方式,直接从地从字节输入流读取JAVA基本类型和String类型的数据,常用于网络传输等(网络传输数据要求与平台无关)

当要求输入输出流必须遵循平台无关时,可以使用这个类

6. PipedInputStream

PipedOutputStream和PipedInputStream分别是管道输出流和管道输入流。

它们的作用是让多线程可以通过管道进行线程间的通讯。在使用管道通信时,必须将PipedOutputStream和PipedInputStream配套使用。

使用管道通信时,大致的流程是:我们在线程A中向PipedOutputStream中写入数据,这些数据会自动的发送到与PipedOutputStream对应的PipedInputStream中,进而存储在PipedInputStream的缓冲中;此时,线程B通过读取PipedInputStream中的数据。就可以实现,线程A和线程B的通信。

7.SequenceInputStream 合并流,将多个输入流合并成一SequenceInputStream流对象。

SequenceInputStream(Enumeration e)

通过记住参数来初始化新创建的 SequenceInputStream,该参数必须是生成运行时类型为 InputStream 对象的Enumeration 型参数。

8. ObjectInputStream 对象输入流

ObjectInputStream确保从流创建的图形中所有对象的类型与Java虚拟机中显示的类相匹配。使用标准机制按需加载类。

只有支持java.io.Serializable或java.io.Externalizable接口的对象才能从流读取。

ByteArrayOutputStream把内存中的数据读到字节数组中,而ByteArrayInputStream又把字节数组中的字节以流的形式读出,实现了对同一个字节数组的操作.

—— 关注更多学习资源! ——

开源

javaH5

程序猿编程

软件开发干货靖凯

源码下载 攻城狮

无码下载求程序媛

copy尼码 秒懂鸟

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181124G1M99I00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券