Для чтения файлов в Scala есть
Source.fromFile("file.txt").mkString
Есть ли эквивалентный и краткий способ записать строку в файл?
Большинство языков поддерживают что-то подобное. Мне больше всего нравится Groovy:
def f = new File("file.txt")
// Read
def s = f.text
// Write
f.text = "file contents"
Я хотел бы использовать код для программ от одной строки до короткой страницы кода. Использование собственной библиотеки здесь не имеет смысла. Я ожидаю, что современный язык позволит мне удобно записывать что-то в файл.
Есть сообщения, похожие на это, но они не отвечают на мой точный вопрос или сосредоточены на более старых версиях Scala.
Например:
Ответы:
Краткая одна строка:
import java.io.PrintWriter new PrintWriter("filename") { write("file contents"); close }
источник
write()
,close
никогда не будет вызываться, и файл не будет закрыт.PrintWriter
также использует системную кодировку по умолчанию, что очень плохо для переносимости. И, наконец, этот подход генерирует отдельный класс специально для этой строки (однако, учитывая, что Scala уже генерирует тонны классов даже для простого кода, это вряд ли само по себе является недостатком).new PrintWriter(tmpFile) { try {write(debugmsg)} finally {close} }
close()
,new java.io.PrintWriter("/tmp/hello") { write("file contents"); close }
Странно, что никто не предлагал операции NIO.2 (доступны с Java 7):
import java.nio.file.{Paths, Files} import java.nio.charset.StandardCharsets Files.write(Paths.get("file.txt"), "file contents".getBytes(StandardCharsets.UTF_8))
Я думаю, что это, безусловно, самый простой, самый легкий и самый идиоматический способ, и он не требует никаких зависимостей без самой Java.
источник
reflect.io.File.writeAll(contents)
. Зачем? Три строки, когда вы включаете два оператора импорта. Возможно, IDE сделает это за вас автоматически, но в REPL это не так просто.Files.write
также принимает вjava.lang.Iterable
качестве второго аргумента, и мы можем получить его из ScalaIterable
, то есть практически любого типа коллекции, используя конвертер:import java.nio.file.{Files, Paths}; import scala.collection.JavaConverters.asJavaIterableConverter; val output = List("1", "2", "3"); Files.write(Paths.get("output.txt"), output.asJava)
Вот краткий однострочный файл с использованием файла reflection.io, он работает в Scala 2.12:
reflect.io.File("filename").writeAll("hello world")
В качестве альтернативы, если вы хотите использовать библиотеки Java, вы можете сделать это:
Some(new PrintWriter("filename")).foreach{p => p.write("hello world"); p.close}
источник
Some
/foreach
Комбо немного напуганный, но это приходит с выгодой не TRY / улова / наконец.Some
/foreach
hack многие люди ненавидят Scala за нечитаемый код, который он заставляет создавать хакеры.scala.tootls.nsc.io.File
это псевдоним дляreflect.io.File
. По-прежнему внутренний API, но хоть немного короче.Если вам нравится синтаксис Groovy, вы можете использовать шаблон проектирования Pimp-My-Library, чтобы перенести его в Scala:
import java.io._ import scala.io._ class RichFile( file: File ) { def text = Source.fromFile( file )(Codec.UTF8).mkString def text_=( s: String ) { val out = new PrintWriter( file , "UTF-8") try{ out.print( s ) } finally{ out.close } } } object RichFile { implicit def enrichFile( file: File ) = new RichFile( file ) }
Он будет работать как положено:
scala> import RichFile.enrichFile import RichFile.enrichFile scala> val f = new File("/tmp/example.txt") f: java.io.File = /tmp/example.txt scala> f.text = "hello world" scala> f.text res1: String = "hello world
источник
import sys.process._ "echo hello world" #> new java.io.File("/tmp/example.txt") !
источник
#>
, что делает!
?echo
инструменту командной строки .Я написал микробиблиотеку : https://github.com/pathikrit/better-files
file.write("Hi!")
или
file << "Hi!"
источник
Вы можете легко использовать утилиты Apache File Utils . Посмотрите на функцию
writeStringToFile
. Мы используем эту библиотеку в наших проектах.источник
У одного также есть этот формат, который одновременно краток, а основная библиотека красиво написана (см. Исходный код):
import scalax.io.Codec import scalax.io.JavaConverters._ implicit val codec = Codec.UTF8 new java.io.File("hi-file.txt").asOutput.write("I'm a hi file! ... Really!")
источник
Думаю, это достаточно лаконично:
scala> import java.io._ import java.io._ scala> val w = new BufferedWriter(new FileWriter("output.txt")) w: java.io.BufferedWriter = java.io.BufferedWriter@44ba4f scala> w.write("Alice\r\nBob\r\nCharlie\r\n") scala> w.close()
источник
Вы можете сделать это с помощью сочетания библиотек 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"))
источник
Я знаю, что это не одна строка, но, насколько я могу судить, она решает проблемы безопасности;
// This possibly creates a FileWriter, but maybe not val writer = Try(new FileWriter(new File("filename"))) // If it did, we use it to write the data and return it again // If it didn't we skip the map and print the exception and return the original, just in-case it was actually .write() that failed // Then we close the file writer.map(w => {w.write("data"); w}).recoverWith{case e => {e.printStackTrace(); writer}}.map(_.close)
Если вас не заботила обработка исключений, вы можете написать
writer.map(w => {w.writer("data"); w}).recoverWith{case _ => writer}.map(_.close)
источник
Используйте аммонитовые операции библиотеку . Синтаксис очень минимален, но ширина библиотеки почти такая же, как и следовало бы ожидать от попытки выполнения такой задачи на языке сценариев оболочки, таком как bash.
На странице, на которую я указал, показаны многочисленные операции, которые можно выполнять с библиотекой, но чтобы ответить на этот вопрос, это пример записи в файл.
import ammonite.ops._ write(pwd/'"file.txt", "file contents")
источник
write(pwd/"version", version)
no'
ОБНОВЛЕНИЕ: с тех пор я создал более эффективное решение, которое я подробно изложил здесь: https://stackoverflow.com/a/34277491/501113
Я все больше и больше работаю над Scala Worksheet в 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")
Наслаждайтесь!
источник
Благодаря магии точки с запятой вы можете сделать все, что угодно, однострочным.
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()
источник