java.io (2) 输入流的复用

发布时间:2019-11-17 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了java.io (2) 输入流的复用脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

输入流的复用在实际的开发中是很常见的场景。

在实际应用中,很多需要提供输入数据API都是用IputStream类作为其参数类型,比如XML文档的解析API就是一个典型的例子。同时很多数据的提供者允许使用者通过InputStream类的对象方式来读取数据。

图片描述

根据java对io的抽象(Stream),流的复用是矛盾的。按照流本身所代表的抽象含义,数据一旦流过去了,就无法被再次利用了。

对于现实应用中存在的对输入流的需求,基本上来说的两种方式可以解决;第一种是利用输入流提供的标记和重置的控制能力,第二种则是把输入流转换成数据来使用。

方法一, 缓冲流类标记与重置

好在java为我们提供现成的解决方案
BufferedInputStream, BufferedOutputStream
利用这两个类中提供的

public synchronized void mark(int readlimIT) 读取位置标记,需要一个允许读取的字节数
public synchronized void reset() throws IOException 将读取位置重置到标记位置。
public boolean markSupported() 检查当前流类是否支持标记功能

这三个方法能有效地解决流复用的问题。

   // 假如我们有三个方法,需要串行的使用我们的 io 输入流。    // public static void PRocess1(InputStream in) throws IOException;    // public static void process2(InputStream in) throws IOException;    // public static void process3(InputStream in) throws IOException;     if (!input.markSupported()) {        this.input = new BufferedInputStream(input);    }    else    {        this.input = input;    }     // 为了能够复用整个流    this.input.mark(Integer.MAX_VALUE);      process1(this.input);    // 重置读取位置,以供下一个使用者使用,以下雷同    this.input.reset();     process2(this.input);    this.input.reset();     process3(this.input);    this.input.reset(); 

方法二, 将流转化成为数据流类

这一种方案就是将流中的数据全部读取到一个字节数组中。在不同的数据接收者之间这些数据的传递是通过字节数组完成的。
将 字节流转化成字节数组 可以使用我们 ByteArrayInputStreamByteArrayOutputStream。这样的话,我们传递的是数据,而不再是原始的io。


ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[2048]; for (int count=0; ( inputStream.read(buffer) ) != -1; ) { arrayOutputStream.write(buffer, 0, count); } ByteArrayInputStream byteArrayOutputStream = new ByteArrayInputStream(arrayOutputStream.toByteArray()); // byteArrayOutputStream 对象就可以作为我们需要复用的数据流,配合 `mark`和`reset` 功能提高io性能。

脚本宝典总结

以上是脚本宝典为你收集整理的java.io (2) 输入流的复用全部内容,希望文章能够帮你解决java.io (2) 输入流的复用所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。