读者/作者/流何时被识别为开放?

时间:2017-06-21 02:48:05

标签: java stream writer reader

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

示例:我有FileStream,其中包含FileReaderFileWriter

我提出的问题是优化课程。我知道由于并发性,我不能同时打开两个流,但是我需要在某个地方初始化它们而不会在整个地方发生数据泄漏。

流/读者/编写者一旦初始化就被分类为开放,或者只在第一次读/写开始后才打开“管道”?我正在查看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();

2 个答案:

答案 0 :(得分:2)

一旦你构建它们就会打开它们。没有“开放”操作,因此它们已经打开。

讨论:

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

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

答案 1 :(得分:1)

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

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

所以,如果你必须环绕......使用那个类,而不是结合其他两个从未打算组合的东西!