Scala - 将字符串打印到文件的正确方法

时间:2015-07-14 13:38:11

标签: string scala batch-file file-io io

打印字符串的正确方法是什么 - 只有字符串 - 才能打印?当我尝试以我所知的标准方式进行时,即:

def printToFile(o:Object,n:String) = try{
  val pathToOutput = "..\\some\\parent\\directory\\"
  val path = Paths.get(pathToOutput + n)

  val b = new ByteArrayOutputStream()
  val os = new ObjectOutputStream(b)
  os.writeObject(o)

  Files.write(path, b.toByteArray,
    StandardOpenOption.CREATE,
    StandardOpenOption.TRUNCATE_EXISTING)
}catch{
  case _:Exception => println("failed to write")
}

似乎总是先于

  

’NULENQtSTXT

ENQt之后的部分似乎有所不同。 (如果我将o声明为对象或字符串,则无关紧要。)

这非常烦人,因为我想打印几个.dot-Strings(Graphviz),然后将生成的.dot文件批量处理为.pdf文件。然而,前面的废话迫使我打开每个.dot文件并手动删除它 - 这种方法违背了批量处理它们的目的。

2 个答案:

答案 0 :(得分:5)

这与Scala无关,它与Java标准库的工作方式无关。当您执行writeObject时,您正在编写Object的序列化表示,以及JVM可用于重新创建该对象的一堆额外字节。如果你知道对象是String,那么强类型(即使用printToFile(o:String,n:String)并使用Files.write(path, o.getBytes, ...。否则你可以使用o.toString.getBytes

答案 1 :(得分:2)

通常在JVM中,如果要写字符而不是字节,则应优先*Writer而不是*OutputStream。在这种情况下(假设您要写一个File并想要写一个String):

val writer = new BufferedWriter(new FileWriter(file))
try {
  writer.write(string)
} finally {
  writer.close()
}

或者使用Files.write

的面向字符的重载
Files.write(path, Collections.singletonList(string), ...)