2017-06-21 59 views
0

我正在爲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

回答

2

只要您構建它們,它們就會打開。沒有「開放」操作,所以它們已經開放。

討論:

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

1

替代解決方案:忘記重新發明車輪。

Java有專門設計爲允許讀取和寫入同一文件中的類:java.io.RandomAcessFile

所以,如果你有環繞...使用這個類,而不是其他結合兩件事情,從來沒有打算合併!

+0

Thankyou承認'RandomAccessFile'但是我正在創建**抽象**類,可以用於任何類型的作家/讀者。文件,字節等 – finnrayment

+0

哦,請原諒我!當然,你可以得到我的讚賞。你的答案是保證質量。 :) – finnrayment

+1

非常感謝! – GhostCat

相關問題