readers/writers/streams 何时被确定为开放?
When are readers/writers/streams identified as being open?
我正在为 Reader
和 Writer
创建一个抽象绑定 class,用户不必单独引用每一个。
示例:我有一个 FileStream
,里面有一个 FileReader
和 FileWriter
。
我的问题是指优化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/OutputStreams
和 StringReader/Writer
根本不需要打开。
替代解决方案:忘记重新发明轮子。
Java 有一个 class 专门设计用于读取和写入同一文件:java.io.RandomAcessFile
因此,如果您必须环绕...使用那个 class,而不是将两个从未打算组合的其他东西组合起来!
我正在为 Reader
和 Writer
创建一个抽象绑定 class,用户不必单独引用每一个。
示例:我有一个 FileStream
,里面有一个 FileReader
和 FileWriter
。
我的问题是指优化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/OutputStreams
和 StringReader/Writer
根本不需要打开。
替代解决方案:忘记重新发明轮子。
Java 有一个 class 专门设计用于读取和写入同一文件:java.io.RandomAcessFile
因此,如果您必须环绕...使用那个 class,而不是将两个从未打算组合的其他东西组合起来!