2015-06-18 61 views
0

我創建了一個函數來創建一個文件。 我的目標是傳入一個json字符串,並返回一個新的File,並將json字符串的內容傳遞給它。我在另一個函數中調用這個函數爲:使用PrintWriter在Scala中創建一個新文件

val jsonFile: File = JsonCreate.getJsonFile(jsonString) 

到目前爲止,我有辦法如下: 我創建一個不存在的新文件,我把它稱爲「myJson.json」

然後我創建一個PrintWriter對象,並使用它來創建我的最終文件。所以,我將json字符串的內容讀入一個StringBuffer,然後再讀入PrintWriter。完成這個之後,我希望將一個文件myJson.json與傳入的Json字符串的內容相關聯。

我對目前爲止的努力結果並不滿意。例如,我不確定我是否按照它應該使用的方式使用了Option。我對使用變量的方式感到不滿意。
如果我在嘗試中聲明一個val,我無法在finally中訪問它。所以我去了Java的方式,並把PrinterWriter的選項變量outside.This是一種代碼味道我不喜歡。
我怎樣才能縮短並仍然保留正確的嘗試捕捉,最後,關閉資源等

這是我在寫這個函數的第一次嘗試:

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

你的方法根本不使用'jsonString'。什麼是'finalJson',它沒有在任何地方定義。 –

+0

我已經做了更正。謝謝 – user3825558

回答

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() 
    } 
} 
+0

這就是我隱約想到的。這個get的使用看起來不對,但是我不能把它放在手上,直到你澄清它爲止。 – user3825558

+0

您只分配一次'outFileOpt'。因此它不需要是'var',而只需要'val'。然後你會發現它是'Some'並且被定義,因此'Option'沒有任何用途。 –

+0

在你的函數中,我將如何修改它來返回一個文件,因爲我需要在我的調用函數中。或者什麼是最好的方式來返回一個文件的新鮮寫入的內容? – user3825558

相關問題