Java 在单行代码段中写入并关闭BufferedWriter

Java 在单行代码段中写入并关闭BufferedWriter,java,file,bufferedwriter,writer,Java,File,Bufferedwriter,Writer,下面是我的代码片段 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(talen

下面是我的代码片段

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。

简单地说,是的:

((BufferedWriter) globalMap.get("Logger")).write("I'm Writing"); ((BufferedWriter) globalMap.get("Logger")).close();
如果您的意思是使用一个方法调用来完成这两件事,除非您定义了一个新的方法来完成。

您可以尝试在资源中使用try-catch。这意味着资源将在try块完成后自动关闭。你可以在这里读更多


你能得到的最接近的是这个,但正如许多其他人已经提到的,没有必要这样做。这只会使事情复杂化:

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

除了使用try-with资源,真正的答案是:不要这样做

你看,你把一个作家放到了一张全球地图上。这使得全世界都可以使用这张地图。接下来,一些代码打算关闭您添加到该映射的writer

但似乎作者自己也在地图上。所以其他代码可以注意到:地图有一个记录器/写入器。。。但是,其他代码如何知道记录器/写入程序是否仍然处于打开状态,或者是否已关闭

在全球地图中有一个记录器/编写器,但它不能在全球范围内使用,这本身就是一个矛盾


换句话说:从概念上讲,你所做的似乎是错误的。或者将这样的记录器/写入器添加到全局映射,那么所有访问该映射的代码都应该能够使用该记录器/写入器,而不用担心它是否仍然处于打开状态?。或者,不要将记录器/写入器放在这样的全局映射中

使用try with resources自动关闭资源,而无需显式关闭它。

这是一行吗?为什么不是一行?因为您所做的只是删除新行。任何格式化程序都会将其转换为两行。删除新行将使其成为一行。我不是说它有用,但它确实是你所要求的。您想请求一条语句还是一个方法调用?程序员应该是精确的,计算机不容易产生歧义。我也猜不出你的意图,因为在映射中留下一个关闭的文件也不是特别有用。有没有办法在一行代码中执行最后两行中发生的两个功能?为什么?把所有东西都塞进一行做什么?好吧,除了让它更难理解、调试和维护之外…@AndrewHenle这里真正奇怪的部分是:当你后来把东西放在全球地图上时,为什么还要把它放在一个让其他人无法使用的状态下@幽灵猫也是。隐式代码行数越少越好,一行代码最好!这个问题的前提是如此误导,以至于我甚至没有达到代码应该做什么的细节。
try (BufferedWriter bw = (BufferedWriter) globalMap.get("Logger")) {
    bw.write("I'm Writing");
}