簡體   English   中英

用單行代碼片段編寫和關閉BufferedWriter

[英]Write and close BufferedWriter in single line code snippet

我在下面的代碼段中。

Map<String, Object> globalMap = new HashMap<String,Object>();
File talendLogFile = new File("C:\\Softwares\\logFiles\\error.log");
Writer talendLogFileWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(talendLogFile, true)));

globalMap.put("Logger", talendLogFileWriter);

((BufferedWriter) globalMap.get("Logger")).write("I'm Writing");
((BufferedWriter) globalMap.get("Logger")).close();

有什么辦法可以執行單行代碼的最后兩行中的兩種功能? 我的意思是寫后立即關閉BufferedWriter

除了使用try-與資源,真正的答案是: 不要做這種方式。

您會看到,您將作家置於全球地圖中。 這使其可以訪問具有該地圖的“整個”世界。 接下來, 一些代碼打算關閉您添加到該地圖的編寫器。

但是似乎作者本身就停留在地圖上。 因此,其他代碼可以注意到:地圖上有一個記錄器/記錄器...但是,其他代碼應該如何知道該記錄器/記錄器是打開還是關閉了呢?

在該全球地圖中有一個記錄器/記錄器,但不能在全球范圍內使用,這本身就是一個矛盾!

換句話說:從概念上講,您在做什么似乎是錯誤的。 要么將這樣一個記錄器/編寫器添加到全局地圖,然后所有有權訪問該地圖的代碼都應該能夠使用該記錄器/編寫器(不必擔心“它是否仍在打開?”)。 或者,你把記錄器/作家在這樣一個全球性的地圖。

平凡,是的:

((BufferedWriter) globalMap.get("Logger")).write("I'm Writing"); ((BufferedWriter) globalMap.get("Logger")).close();

如果您的意思是使用單個方法調用來完成這兩項操作,那么除非您定義一個新方法才能這樣做。

您可以嘗試對try-catch with resources使用try-catch with resources 這意味着資源將在try block完成后自動關閉。 您可以在這里閱讀更多內容https://www.baeldung.com/java-try-with-resources

try(Writer talendLogFileWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(talendLogFile, true)))) {

    globalMap.put("Logger", talendLogFileWriter);

    ((BufferedWriter) globalMap.get("Logger")).write("I'm Writing");

}catch(Exception ignored){} //handle the exception if you want

您可以得到的最接近的是這種方法,但是正如許多其他人已經提到的那樣,沒有必要這樣做。 它只會使事情復雜化:

try (BufferedWriter bw = (BufferedWriter) globalMap.get("Logger")) {
    bw.write("I'm Writing");
}

對資源使用try可以自動關閉資源,而無需顯式關閉它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM