使用PrintWriter

时间:2015-06-18 23:55:27

标签: scala

我创建了一个创建文件的函数。 我的目标是传入一个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

      }


}

1 个答案:

答案 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()
  }
}