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

在上面的样例中。我们通过FileInputStream的read方法读取file1.txt中的数据,然后将获得的字节数据通过FileOutputStream的write方法将其写入到还有一个文件file2.txt中,这样就实现了文件的拷贝,即将file1.txt复制到file2.txt。

假设file2.txt已经存在,那么在初始FileOutputStream时,能够传入一边boolean变量append表示是向已有文件里追加写入数据还是覆盖已有数据。

PipedInputStream & PipedOutputStream

PipedInputStream和PipedOutputStream通常是结合使用的。这两个类用于在两个线程间进行管道通信,一般在一个线程中运行PipedOutputStream 的write操作。而在还有一个线程中运行PipedInputStream的read操作。能够在构造函数中传入相关的流将PipedInputStream 和PipedOutputStream 绑定起来,也能够通过二者的connect方法将二者绑定起来,一旦二者进进行了绑定,那么PipedInputStream的read方法就会自己主动读取PipedOutputStream写入的数据。PipedInputStream的read操作是堵塞式的,当运行PipedOutputStream的write操作时,PipedInputStream会在还有一个线程中自己主动读取PipedOutputStream写入的内容,假设PipedOutputStream一直没有运行write操作写入数据,那么PipedInputStream的read方法会一直堵塞PipedInputStream的read方法所运行的线程直至读到数据。

单独使用PipedInputStream或单独使用PipedOutputStream时没有不论什么意义的。必须将二者通过connect方法(或在构造函数中传入相应的流)进行连接绑定。假设单独使用当中的某一个类,就会触发IOException: Pipe Not Connected.
下面是PipedInputStream和PipedOutputStream的代码演示样例片段:

WriterThread类

import java.io.*; public class WriterThread extends Thread { PipedOutputStream pos = null; public WriterThread(PipedOutputStream pos){ this.pos = pos; } @Override public void run() { String message = "这条信息来自于WriterThread."; try{ byte[] bytes = message.getBytes("UTF-8"); System.out.println("WriterThread发送信息"); this.pos.write(bytes); this.pos.close(); }catch (IOException e){ e.printStackTrace(); } } }

ReaderThread类 import java.io.*; public class ReaderThread extends Thread { private PipedInputStream pis = null; public ReaderThread(PipedInputStream pis){ this.pis = pis; } @Override public void run() { byte[] buf = new byte[1024 * 8]; try{ System.out.println("ReaderThread堵塞式的等待接收数据..."); int length = pis.read(buf); System.out.println("ReaderThread接收到例如以下信息:"); String message = new String(buf, 0, length, "UTF-8"); System.out.println(message); pis.close(); }catch(IOException e){ e.printStackTrace(); } } }

測试代码

private static void testPipedInputOutputStream(){ try{ PipedInputStream pis = new PipedInputStream(); PipedOutputStream pos = new PipedOutputStream(); pos.connect(pis); WriterThread writerThread = new WriterThread(pos); ReaderThread readerThread = new ReaderThread(pis); readerThread.start(); writerThread.start(); }catch (IOException e){ e.printStackTrace(); } }

在上面的实例中,我们创建了两个线程类WriterThread和ReaderThread,在WriterThread的构造函数中我们传入了一个PipedOutputStream,并在线程运行run方法时向WriterThread中写入数据。在ReaderThread的构造函数中我们传入了一个PipedInputStream。在其线程运行run方法时堵塞式的运行read操作。等待获取数据。

我们通过pos.connect(pis)将这两种流绑定在一起,最后分别运行线程ReaderThread和WriterThread。


输出结果例如以下:

输出结果

我们能够看到即使我们先运行了ReaderThread线程,ReaderThread中的PipedInputStream还是一直在堵塞式的等待数据的到来。

ObjectInputStream & ObjectOutputStream

ObjectOutputStream具有一系列writeXXX方法,在其构造函数中能够掺入一个OutputStream,能够方便的向指定的输出流中写入基本类型数据以及String。比方writeBoolean、writeChar、writeInt、writeLong、writeFloat、writeDouble、writeCharts、writeUTF等,除此之外。ObjectOutputStream还具有writeObject方法。writeObject方法中传入的类型必须实现了Serializable接口,从而在运行writeObject操作时将对象进行序列化成流。并将其写入指定的输出流中。与ObjectOutputStream相相应的是ObjectInputStream,ObjectInputStream有与OutputStream中的writeXXX系列方法全然相应的readXXX系列方法,专门用于读取OutputStream通过writeXXX写入的数据。


下面是ObjectInputStream 和 ObjectOutputStream的演示样例代码:

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

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