Zum Lesen von Dateien in Scala gibt es
Source.fromFile("file.txt").mkString
Gibt es eine äquivalente und präzise Möglichkeit, einen String in eine Datei zu schreiben?
Die meisten Sprachen unterstützen so etwas. Mein Favorit ist Groovy:
def f = new File("file.txt")
// Read
def s = f.text
// Write
f.text = "file contents"
Ich möchte den Code für Programme verwenden, die von einer einzelnen Zeile bis zu einer kurzen Codepage reichen. Eine eigene Bibliothek benutzen zu müssen, macht hier keinen Sinn. Ich erwarte von einer modernen Sprache, dass ich bequem etwas in eine Datei schreiben kann.
Es gibt ähnliche Beiträge, aber sie beantworten meine genaue Frage nicht oder konzentrieren sich auf ältere Scala-Versionen.
Beispielsweise:
Antworten:
Eine kurze Zeile:
quelle
write()
,close
wird diese niemals aufgerufen und die Datei wird nicht geschlossen.PrintWriter
Verwendet auch die Standardsystemcodierung, die für die Portabilität sehr schlecht ist. Und schließlich generiert dieser Ansatz eine separate Klasse speziell für diese Zeile (da Scala jedoch selbst für einen einfachen Code bereits Tonnen von Klassen generiert, ist dies an sich kaum ein Nachteil).new PrintWriter(tmpFile) { try {write(debugmsg)} finally {close} }
close()
, denke ichnew java.io.PrintWriter("/tmp/hello") { write("file contents"); close }
Es ist seltsam, dass niemand NIO.2-Operationen vorgeschlagen hat (verfügbar seit Java 7):
Ich denke, dies ist bei weitem der einfachste und einfachste und idiomatischste Weg, und es werden keine Abhängigkeiten ohne Java selbst benötigt.
quelle
reflect.io.File.writeAll(contents)
. Warum? Drei Zeilen, wenn Sie die beiden Importanweisungen einfügen. Vielleicht erledigt die IDE dies automatisch für Sie, aber wenn es in der REPL nicht so einfach ist.Files.write
auch immer, akzeptiert auch ajava.lang.Iterable
als zweites Argument, und wir können das von einer ScalaIterable
, dh so ziemlich jedem Sammlungstyp, mit einem Konverter erhalten: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)
Hier ist ein prägnanter Einzeiler mit Reflect.io.file, der mit Scala 2.12 funktioniert:
Wenn Sie die Java-Bibliotheken verwenden möchten, können Sie alternativ diesen Hack ausführen:
quelle
Some
/foreach
Combo ist ein bisschen funky, hat aber den Vorteil, dass kein Versuch / Fang / Endlich möglich ist.Some
/foreach
hack ist genau der Grund, warum viele Leute Scala für den unlesbaren Code hassen, den Hacker produzieren.scala.tootls.nsc.io.File
ist ein Alias für diereflect.io.File
. Immer noch interne API, aber zumindest etwas kürzer.Wenn Sie die Groovy-Syntax mögen, können Sie das Entwurfsmuster Pimp-My-Library verwenden, um es zu Scala zu bringen:
Es wird wie erwartet funktionieren:
quelle
quelle
#>
, was macht das!
?echo
.Eine Mikrobibliothek, die ich geschrieben habe: https://github.com/pathikrit/better-files
oder
quelle
Sie können Apache File Utils problemlos verwenden . Schauen Sie sich die Funktion an
writeStringToFile
. Wir verwenden diese Bibliothek in unseren Projekten.quelle
Man hat auch dieses Format, das sowohl prägnant ist als auch die zugrunde liegende Bibliothek wunderschön geschrieben ist (siehe Quellcode):
quelle
Das ist kurz genug, denke ich:
quelle
Sie können dies mit einer Mischung aus Java- und Scala-Bibliotheken tun. Sie haben die volle Kontrolle über die Zeichenkodierung. Leider werden die Dateihandles nicht richtig geschlossen.
quelle
Ich weiß, dass es nicht eine Zeile ist, aber es löst die Sicherheitsprobleme, soweit ich das beurteilen kann.
Wenn Sie sich nicht um die Ausnahmebehandlung gekümmert haben, können Sie schreiben
quelle
UPDATE: Ich habe seitdem eine effektivere Lösung erstellt, auf die ich hier näher eingegangen bin: https://stackoverflow.com/a/34277491/501113
Ich arbeite immer mehr im Scala-Arbeitsblatt innerhalb der Scala-IDE für Eclipse (und ich glaube, dass IntelliJ IDEA etwas Äquivalentes enthält). Wie auch immer, ich muss in der Lage sein, einen Einzeiler zu erstellen, um einen Teil des Inhalts auszugeben, wenn ich die Meldung "Ausgabe überschreitet Grenzwert" erhalte. Nachricht, wenn ich etwas Bedeutendes tue, insbesondere mit den Scala-Sammlungen.
Ich habe mir einen Einzeiler ausgedacht, den ich oben in jedes neue Scala-Arbeitsblatt eingefügt habe, um dies zu vereinfachen (und daher muss ich nicht die gesamte Übung zum Importieren externer Bibliotheken für einen sehr einfachen Bedarf durchführen). Wenn Sie ein Stickler sind und feststellen, dass es sich technisch gesehen um zwei Zeilen handelt, dient dies nur dazu, die Lesbarkeit in diesem Forum zu verbessern. Es ist eine einzelne Zeile in meinem Scala-Arbeitsblatt.
Und die Verwendung ist einfach:
Auf diese Weise kann ich optional den Dateinamen angeben, falls ich zusätzliche Dateien über den Standard hinaus haben möchte (wodurch die Datei bei jedem Aufruf der Methode vollständig überschrieben wird).
Die zweite Verwendung ist also einfach:
Genießen!
quelle
Verwenden Sie die Ammonite Ops Library. Die Syntax ist sehr minimal, aber die Breite der Bibliothek ist fast so groß, wie man es erwarten würde, wenn man eine solche Aufgabe in einer Shell-Skriptsprache wie bash versucht.
Auf der Seite, auf die ich verlinkt habe, werden zahlreiche Vorgänge angezeigt, die mit der Bibliothek ausgeführt werden können. Um diese Frage zu beantworten, ist dies ein Beispiel für das Schreiben in eine Datei
quelle
Durch die Magie des Semikolons können Sie alles, was Sie möchten, zu einem Einzeiler machen.
quelle