2015-06-18 4 views
0

Я создал функцию для создания файла. Моя цель - передать строку json и вернуть новый файл с содержимым строки json, переданной в него. Я называю эту функцию в другой функции, как:Создание нового файла в Scala с PrintWriter

val jsonFile: File = JsonCreate.getJsonFile(jsonString) 

До сих пор, как у меня выглядит следующим образом: создать новый файл, который не существует, и я называю это «myJson.json»

Затем я создаю объект PrintWriter с идеей использования этого для создания моего окончательного файла. Итак, я прочитал содержимое строки json, в StringBuffer, а затем в PrintWriter. Сделав это, я надеюсь получить файл myJson.json с содержимым переданного в строке Json.

Я до сих пор не доволен результатом моих усилий. Например, я не уверен, использовал ли я Опцию так, как она должна использоваться. Я не доволен тем, как я использую вары.
Если я объявлю вал внутри попытки, я не смогу получить к нему доступ в конце. Поэтому я перехожу на Java-путь и помещаю переменную Option PrinterWriter снаружи. Это запах кода, который мне не нравится.
Как я могу сократить его и до сих пор сохраняет за собой право попробовать поймать и, наконец, закрыть ресурсы и т.д.

Это моя первая попытка написать эту функцию:

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.

Intercepting исключения печати они не являются хорошей практикой. Пусть они распространяются на вызывающего.

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

Смежные вопросы