我创建了一个创建文件的函数。 我的目标是传入一个json字符串并返回一个新文件,其中包含传入其中的json字符串的内容。我在另一个函数中调用此函数:
val jsonFile: File = JsonCreate.getJsonFile(jsonString)
到目前为止,我的方式如下: 我创建了一个不存在的新文件,我称之为#34; myJson.json"
然后我创建一个PrintWriter对象,想法使用它来创建我的最终文件。所以,我将json字符串的内容读入StringBuffer,然后读入PrintWriter。完成后,我希望有一个文件myJson.json,其中包含传入的Json字符串的内容。
到目前为止,我对我的努力结果并不满意。例如,我不确定我是否按照它应该使用的方式使用了Option。我对使用变量的方式不满意。
如果我在try中声明了val,我无法在finally中访问它。所以我采用Java方式并将PrinterWriter Option变量放在外面。这是我不喜欢的代码味道。
如何缩短它并保持正确的尝试捕获,最后,关闭资源等。
这是我写这个函数的第一次尝试:
import java.io._
import java.util.Scanner
object JsonCreate{
def createFile(jsonString: String): File = {
var tmpFile = new File("myJson.json")
var outFileOpt: Option[PrintWriter] = Some(new PrintWriter(new FileWriter(tmpFile, true)))
try {
//Update: Corrected the value of the Scanner parameter
val inFile: Scanner = new Scanner(jsonString)
while(inFile.hasNextLine) {
val strBuf = new StringBuffer(inFile.nextLine())
println("Contents of String Buffer is: " + strBuf)
outFileOpt.get.print(strBuf)
}
}catch {
case fnfex: FileNotFoundException => fnfex.printStackTrace()
case ioex: IOException => ioex.printStackTrace()
} finally {
outFileOpt.get.close()
}
tmpFile
}
}
答案 0 :(得分:1)
无需将文件存储在Option
中。使用Option.get
通常表示您做错了,因为您认为该选项已设置。
然后,如果你已经有了一个字符串,你没有理由想要扫描它,写入另一个缓冲区等。只需将它直接写入文件,例如使用FileOutputStream.
拦截异常以将其打印出来并不是一种好习惯。让他们传播给来电者。
import java.io.{File, FileOutputStream}
def writeTextFile(f:File, contents: String, encoding: String = "UTF-8"): Unit = {
val fos = new FileOutputStream(f)
try {
fos.write(contents.getBytes(encoding))
} finally {
fos.close()
}
}