Scala: записать строку в файл одним оператором - PullRequest
133 голосов
/ 30 июля 2011

Для чтения файлов в Scala есть

Source.fromFile("file.txt").mkString

Существует ли эквивалентный и краткий способ записи строки в файл?

Большинство языков поддерживают что-то подобное. Мой любимый Groovy:

def f = new File("file.txt")
// Read
def s = f.text
// Write
f.text = "file contents"

Я хотел бы использовать код для программ в диапазоне от одной строки до короткой страницы кода. Необходимость использовать свою собственную библиотеку здесь не имеет смысла. Я ожидаю, что современный язык позволит мне удобно что-то записывать в файл.

Есть сообщения, похожие на это, но они не отвечают на мой точный вопрос или ориентированы на более старые версии Scala.

Например:

Ответы [ 13 ]

2 голосов
/ 09 августа 2013

Вы можете сделать это с помощью набора библиотек Java и Scala.Вы будете иметь полный контроль над кодировкой символов.Но, к сожалению, описатели файлов не будут закрыты должным образом

scala> import java.io.ByteArrayInputStream
import java.io.ByteArrayInputStream

scala> import java.io.FileOutputStream
import java.io.FileOutputStream

scala> BasicIO.transferFully(new ByteArrayInputStream("test".getBytes("UTF-8")), new FileOutputStream("test.txt"))
1 голос
/ 01 ноября 2013

ОБНОВЛЕНИЕ: с тех пор я создал более эффективное решение, которое я разработал здесь: https://stackoverflow.com/a/34277491/501113

Я все больше и больше работаю над рабочим листом Scala в Scala IDE для Eclipse (и я считаю, что в IntelliJ IDEA есть что-то эквивалентное). В любом случае, мне нужно иметь возможность сделать одну строку для вывода некоторого содержимого, так как я получаю «Вывод превышает предел отсечения». сообщение, если я делаю что-то значительное, особенно с коллекциями Scala.

Я придумал однострочник, который вставляю в верхнюю часть каждого нового рабочего листа Scala, чтобы упростить это (и поэтому мне не нужно выполнять целое упражнение по импорту внешних библиотек для очень простой необходимости). Если вы сторонник и заметили, что это технически две строки, это только для того, чтобы сделать его более читабельным на этом форуме. Это единственная строка в моей Таблице Scala.

def printToFile(content: String, location: String = "C:/Users/jtdoe/Desktop/WorkSheet.txt") =
  Some(new java.io.PrintWriter(location)).foreach{f => try{f.write(content)}finally{f.close}}

И использование просто:

printToFile("A fancy test string\ncontaining newlines\nOMG!\n")

Это позволяет мне при желании указать имя файла, если я хочу иметь дополнительные файлы помимо значений по умолчанию (которые полностью перезаписывают файл при каждом вызове метода).

Итак, второе использование просто:

printToFile("A fancy test string\ncontaining newlines\nOMG!\n", "C:/Users/jtdoe/Desktop/WorkSheet.txt")

Наслаждайтесь!

0 голосов
/ 16 февраля 2017

С помощью магии точки с запятой вы можете сделать все, что вам нравится, в одну строку.

import java.io.PrintWriter
import java.nio.file.Files
import java.nio.file.Paths
import java.nio.charset.StandardCharsets
import java.nio.file.StandardOpenOption
val outfile = java.io.File.createTempFile("", "").getPath
val outstream = new PrintWriter(Files.newBufferedWriter(Paths.get(outfile)
  , StandardCharsets.UTF_8
  , StandardOpenOption.WRITE)); outstream.println("content"); outstream.flush(); outstream.close()
...