什么时候读者/作家/流被确定为开放?

问题描述:

我正在为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(); 
+1

两者都实现'Closeable',所以如果在'try-with'中使用,将会自动关闭请参阅https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html –

+0

_“我知道由于并发,我不能同时打开两个流“_ - 你是什么意思?你的意思是输入和输出在同一个文件上? _“没有任何数据泄漏” - 为什么你会认为这会发生?请显示一些实际的代码并解释一个实际的问题。就目前而言,您的问题似乎基于一些误解,并且太抽象而无法回答。 –

+0

@JimGarrison我没有例子,但是我正在做一个单线程,如果在同一时间完成同步问题。没有用处写入文件,然后试图读取缓冲区正在查看不同的东西时。我的问题没有提到明确的问题,而是提到了(三)类的抽象性质,因此是的,我写了一个抽象问题。然而,它并不含糊,我相信一个答案很可能会被回答。 – finnrayment

只要您构建它们,它们就会打开。没有“开放”操作,所以它们已经开放。

讨论:

new FileInputStream(...)new FileOutputStream(...)打开该文件,因为他们扔IOExceptions了。实际上,其他每个输入或输出流都将FilterInput/OutputStream,FileInput/OutputStream作为代表(事实上包括套接字输入/输出流)进行扩展。 FileInput/OutputStream首先在任何这样的堆栈中创建,ergo它在装饰器流之前已经打开,ergo它们也已经打开。

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

+0

然后很高兴知道。简单而直接的答案;比你!+1 – finnrayment

+0

我同意;尽管我认为一小部分额外的信息/解释会有所帮助。到目前为止,唯一让这件事成为“可信答案”的是情境知识(例如“EJP声称什么时候,它通常是现货)”。 – GhostCat

+0

@GhostCat这一切都很好,但'额外的信息/解释',如什么?它很明显。没有“开放”操作,所以它们已经开放。 QED。我不知道Javadoc中有任何陈述,但这并不需要。 – EJP

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

Java有专门设计为允许读取和写入同一文件中的类:java.io.RandomAcessFile

所以,如果你有环绕...使用这个类,而不是其他结合两件事情,从来没有打算合并!

+0

Thankyou承认'RandomAccessFile'但是我正在创建**抽象**类,可以用于任何类型的作家/读者。文件,字节等 – finnrayment

+0

哦,请原谅我!当然,你可以得到我的赞赏。你的答案是保证质量。 :) – finnrayment

+1

非常感谢! – GhostCat