我想使用单件代码,如果参数不是null,则写入文件,否则使用标准输出。
我有下面的片段
val fileName: String = null
var writer: java.io.PrintWriter = null
if (fileName==null)
writer = new java.io.PrintWriter(System.out)
else
writer = new java.io.PrintWriter(new java.io.File(fileName))
writer.println("111")
writer.flush()
//writer.close()
System.out.println("222")一切都如预期的那样工作,但我假设在一般情况下,需要在使用它之后关闭编写器,。如果我错了,请纠正我。
但是,如果我取消注释writer.close(),那么"222“就不是发音了,所以看起来像关闭PrintWriter会禁用标准输出。
另一个问题是如何在没有var的情况下重写代码。
更新
没有var的代码可以如下所示(我故意不使用import)
def getWriter(filename: String): java.io.PrintWriter = {
if (fileName==null)
new java.io.PrintWriter(System.out)
else
new java.io.PrintWriter(new java.io.File(fileName))
}
val writer = getWriter(fileName)发布于 2021-05-07 00:16:14
是啊。别把标准关在外面。
您可以包装System.out,使接近调用什么都不做。在java中,它看起来类似于:
PrintStream closeIgnoringOut = new PrintStream(System.out) {
@Override public void close() {}
};发布于 2021-05-07 05:01:31
即使filename是一个适当的String,它也可能不是一个可写文件。
def getWriter(filename: String): java.io.PrintWriter =
util.Try(new java.io.PrintWriter(new java.io.File(filename)))
.getOrElse(new java.io.PrintWriter(System.out){
override def close() = ()
})如果System.out由于任何原因失败,这将默认为filename。
https://stackoverflow.com/questions/67427415
复制相似问题