Java中常见的IO流及其使用(4)

我们通过FileInputStream分别获取了file1.txt和file2.txt的输入流,然后将这两个输入流作为构造函数的參数创建了SequenceInputStream 的实例,所以该SequenceInputStream 中已经在逻辑上将file1.txt和file2.txt的内容合并为了一个输入流,然后我们读取该SequenceInputStream 中的数据,并将读到的数据写入到一个新的FileOutputStream中,这样我们就实现了将file1.txt和file2.txt合并为一个新的文件file3.txt,原有的file1.txt和file2.txt文件不受不论什么影响。

StringBufferInputStream

StringBufferInputStream同意通过在构造函数中传入字符串以读取字节,在读取时内部主要调用了String的charAt方法。与SequenceInputStream相似。StringBufferInputStream也没有相应的OutputStream。即不存在StringBufferOutputStream类。

Java没有设计StringBufferOutputStream类的理由也非常easy。我们假设StringBufferOutputStream存在,那么StringBufferOutputStream应该是内部通过运行write操作写入数据更新其内部的String对象,比方有可能是通过StringBuilder来实现,可是这样做毫无意义,由于一旦我们String的构造函数中能够直接传入字节数组构建字符串。简单明了,所以设计StringBufferOutputStream就没有太大的必要了。StringBufferInputStream这个类本身存在一点问题,它不能非常好地将字符数组转换为字节数组,所以该类被Java标记为废弃的(Deprecated),其官方推荐使用StringReader作为取代。


下面是关于StringBufferInputStream的演示样例代码:

private static void testStringBufferInputStream(){ String message = "I am iSpirng."; StringBufferInputStream sbis = new StringBufferInputStream(message); byte[] buf = new byte[1024]; try{ int length = sbis.read(buf); if(length > 0){ System.out.println(new String(buf, 0, length, "UTF-8")); } sbis.close(); }catch (IOException e){ e.printStackTrace(); } }

输出结果例如以下:

输出结果

FilterInputStream & FilterOutputStream

FilterInputStream包括了其它的输入流,说具体点就是在其构造函数中须要传入一个InputStream并将其保存在其名为in的字段中,FilterInputStream仅仅是简单的覆盖了全部的方法。之所说是简单覆盖是由于在每一个覆盖函数中。它仅仅是调用内部的保存在in字段中的InputStream所相应的方法,比方在其覆盖read方法时,内部仅仅是简单调用了in.read()方法。FilterInputStream的子类能够进一步覆盖某些方法以保持接口不变的情况下实现某一特性(比方其子类有的能够通过使用缓存优化读取的效率)或者提供一些其它额外的实用方法。所以在使用时FilterInputStream能够让传入的InputStream具有一些额外的特性。即对构造函数传入的InputStream进行了一层包裹,使用了典型的装饰着模式,假设仅仅看FilterInputStream本身这一个类的话。则该类自己本身意义不大。由于其仅仅是通过内部的字段in简单覆写某些方法。

可是假设将FilterInputStream 和其子类结合起来使用话,那么就非常实用了。

比方FilterInputStream 有两个子类BufferedInputStream和DataInputStream,这两个类在下面还会具体介绍。

BufferedInputStream对read操作做了优化,每次读操作时都读取一大块数据。然后将其放入内部维护的一个字节数组缓冲区中。当外面调用BufferedInputStream的read方法时,首先去该缓冲区中读取数据,这样就避免了频繁的实际的读操作。BufferedInputStream对外没有暴露额外的其它方法,可是其内部的read方法已经经过优化了。所以在运行读操作的时候效率更高。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/63c32dad80932cb22e19ef26dec9a435.html