readers/writers/streams 何时被确定为开放?

When are readers/writers/streams identified as being open?

我正在为 ReaderWriter 创建一个抽象绑定 class,用户不必单独引用每一个。

示例:我有一个 FileStream,里面有一个 FileReaderFileWriter

我的问题是指优化class。我知道由于并发性,我不能同时打开两个流,但是我需要在某个地方初始化它们,而不会到处都是数据泄漏。

streams/readers/writers class 是否在您初始化它们后立即打开,或者 'pipes' 是否仅在第一个 read/write 开始时打开?我正在查看 JavaDoc,但在这里看不到任何关于流实际打开时间的信息...

对于那些不明白我在问什么的人(忽略 try-catch 块):

// does my reader become OPEN here?
BufferedReader br = new BufferedReader(new FileReader("foobar.txt"));

// or here, now that I have performed the first operation.
br.readLine();

一建就开。没有'open'操作,所以它们已经打开了。

讨论:

new FileInputStream(...)new FileOutputStream(...) 打开文件,因为他们抛出了 IOExceptions 。实际上,每个其他输入或输出流都使用 FileInput/OutputStream 作为其委托扩展 FilterInput/OutputStream,(事实上,包括套接字 input/output 流)。 FileInput/OutputStream 首先在任何此类堆栈中创建,ergo 它在装饰器流之前已经打开,ergo 它们也已经打开.

ByteArrayInput/OutputStreamsStringReader/Writer 根本不需要打开。

替代解决方案:忘记重新发明轮子。

Java 有一个 class 专门设计用于读取和写入同一文件:java.io.RandomAcessFile

因此,如果您必须环绕...使用那个 class,而不是将两个从未打算组合的其他东西组合起来!