打印字符串的正确方法是什么 - 只有字符串 - 才能打印?当我尝试以我所知的标准方式进行时,即:
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文件并手动删除它 - 这种方法违背了批量处理它们的目的。
答案 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), ...)