【问题标题】:Creating a new File in Scala with PrintWriter使用 PrintWriter 在 Scala 中创建新文件
【发布时间】:2015-06-18 23:55:27
【问题描述】:

我创建了一个函数来创建一个文件。 我的目标是传入一个 json 字符串并返回一个新文件,其中包含传入的 json 字符串的内容。我在另一个函数中调用这个函数为:

val jsonFile: File = JsonCreate.getJsonFile(jsonString)

到目前为止,我的方式如下: 我创建了一个不存在的新文件,我称之为“myJson.json”

然后我创建了一个 PrintWriter 对象,并打算使用它来创建我的最终文件。因此,我将 json 字符串的内容读入 StringBuffer,然后再读入 PrintWriter。完成后,我希望有一个 myJson.json 文件,其中包含传入的 Json 字符串的内容。

到目前为止,我对自己努力的结果并不满意。例如,我不确定我是否按照应有的方式使用了 Option。我对使用 vars 的方式不满意。
如果我在 try 中声明一个 val,我将无法在 finally 中访问它。所以我采用 Java 方式并将 PrinterWriter Option 变量放在外面。这是我不喜欢的代码味道。
我怎样才能缩短它并仍然保留正确的try catch,最后关闭资源等。

这是我第一次尝试编写这个函数:

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

      }


}

【问题讨论】:

  • 你的方法根本没有使用jsonString。什么是finalJson,它没有在任何地方定义。
  • 我已经更正了。谢谢

标签: scala


【解决方案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()
  }
}

【讨论】:

  • 我隐约是这么想的。不知何故,get 的使用看起来不正确,但在您澄清之前,我无法确定它。
  • 您只分配了一次outFileOpt。因此它不需要是var,而只是val。然后你会看到它是 Some 并已定义,因此 Option 没有任何用途。
  • 在你的函数中,我将如何修改它以返回一个文件,因为我在调用函数中需要它。或者将包含新写入内容的文件返回到其中的最佳方法是什么?
  • 感谢您对 outFileOpt 需要成为 var 的评论。我将尝试根据您所说的重写函数
  • 如果你在函数内部定义f: File——就在fos之前——使函数的返回类型为File而不是Unit,将f放在最后一行使其成为返回值。 def writeTextFile(contents: String): File = { val f = new File(???); val fos = ...; try { ... } finally { ... }; f }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多