我正在为Reader
和Writer
创建一个抽象绑定类,其中用户不必单独引用每个类。
示例:我有FileStream
,其中包含FileReader
和FileWriter
。
我提出的问题是优化课程。我知道由于并发性,我不能同时打开两个流,但是我需要在某个地方初始化它们而不会在整个地方发生数据泄漏。
流/读者/编写者一旦初始化就被分类为开放,或者只在第一次读/写开始后才打开“管道”?我正在查看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();
答案 0 :(得分:2)
一旦你构建它们就会打开它们。没有“开放”操作,因此它们已经打开。
讨论:
new FileInputStream(...)
和new FileOutputStream(...)
打开文件,因为它们会向其发送IOExceptions
。实际上,每个其他输入或输出流都以FilterInput/OutputStream,
作为其委托扩展FileInput/OutputStream
(事实上包括套接字输入/输出流)。 FileInput/OutputStream
首先在任何此类堆栈中创建, ergo 它在装饰器流之前已经打开, ergo 它们也已经打开。
ByteArrayInput/OutputStreams
和StringReader/Writer
根本不需要打开。
答案 1 :(得分:1)
替代解决方案:忘记重新发明轮子。
Java有一个专门设计用于读取和写入同一文件的类:java.io.RandomAcessFile
所以,如果你必须环绕......使用那个类,而不是结合其他两个从未打算组合的东西!