Pour lire des fichiers dans Scala, il existe
Source.fromFile("file.txt").mkString
Existe-t-il un moyen équivalent et concis d'écrire une chaîne dans un fichier?
La plupart des langues prennent en charge quelque chose comme ça. Mon préféré est Groovy:
def f = new File("file.txt")
// Read
def s = f.text
// Write
f.text = "file contents"
J'aimerais utiliser le code pour des programmes allant d'une seule ligne à une courte page de code. Devoir utiliser votre propre bibliothèque n'a pas de sens ici. Je m'attends à ce qu'un langage moderne me permette d'écrire quelque chose dans un fichier facilement.
Il existe des articles similaires à celui-ci, mais ils ne répondent pas à ma question exacte ou sont axés sur les anciennes versions de Scala.
Par exemple:
Réponses:
Une ligne concise:
la source
write()
,close
ne sera jamais appelée et le fichier ne sera pas fermé.PrintWriter
utilise également le codage système par défaut, ce qui est très mauvais pour la portabilité. Et enfin, cette approche génère une classe distincte spécifiquement pour cette ligne (cependant, étant donné que Scala génère déjà des tonnes de classes même pour un code simple, ce n'est guère un inconvénient en soi).new PrintWriter(tmpFile) { try {write(debugmsg)} finally {close} }
close()
, je pensenew java.io.PrintWriter("/tmp/hello") { write("file contents"); close }
Il est étrange que personne n'ait suggéré d'opérations NIO.2 (disponibles depuis Java 7):
Je pense que c'est de loin le moyen le plus simple et le plus simple et le plus idiomatique, et il n'a besoin d'aucune dépendance sans Java lui-même.
la source
reflect.io.File.writeAll(contents)
. Pourquoi? Trois lignes lorsque vous incluez les deux instructions d'importation. Peut-être que l'EDI le fait automatiquement pour vous, mais si dans le REPL ce n'est pas aussi facile.Files.write
accepte également ajava.lang.Iterable
comme deuxième argument, et nous pouvons l'obtenir à partir d'une ScalaIterable
, c'est-à-dire à peu près n'importe quel type de collection, en utilisant un convertisseur: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)
Voici un one-liner concis utilisant reflect.io.file, cela fonctionne avec Scala 2.12:
Alternativement, si vous souhaitez utiliser les bibliothèques Java, vous pouvez faire ce hack:
la source
Some
/foreach
combo est un peu génial, mais il a l'avantage de ne pas essayer / attraper / enfin.Some
/foreach
hack est exactement la raison pour laquelle beaucoup de gens détestent Scala pour le code illisible qu'il fait produire par les pirates.scala.tootls.nsc.io.File
est un alias pour lereflect.io.File
. Toujours API interne, mais au moins un peu plus courte.Si vous aimez la syntaxe Groovy, vous pouvez utiliser le modèle de conception Pimp-My-Library pour l'amener à Scala:
Cela fonctionnera comme prévu:
la source
la source
#>
ce que c'est que!
faire?echo
outil de ligne de commande.Une micro bibliothèque que j'ai écrite: https://github.com/pathikrit/better-files
ou
la source
Vous pouvez facilement utiliser Apache File Utils . Regardez la fonction
writeStringToFile
. Nous utilisons cette bibliothèque dans nos projets.la source
On a aussi ce format, qui est à la fois concis et la bibliothèque sous-jacente est magnifiquement écrite (voir le code source):
la source
C'est assez concis, je suppose:
la source
Vous pouvez le faire avec un mélange de bibliothèques Java et Scala. Vous aurez un contrôle total sur l'encodage des caractères. Mais malheureusement, les descripteurs de fichiers ne seront pas fermés correctement.
la source
Je sais que ce n'est pas une ligne, mais cela résout les problèmes de sécurité pour autant que je sache;
Si vous ne vous souciez pas de la gestion des exceptions, vous pouvez écrire
la source
MISE À JOUR: J'ai depuis créé une solution plus efficace sur laquelle j'ai élaboré ici: https://stackoverflow.com/a/34277491/501113
Je travaille de plus en plus dans la feuille de travail Scala dans l'EDI Scala pour Eclipse (et je crois qu'il y a quelque chose d'équivalent dans IntelliJ IDEA). Quoi qu'il en soit, je dois être capable de faire un one-liner pour sortir une partie du contenu lorsque j'obtiens le message "La sortie dépasse la limite de coupure". message si je fais quelque chose d'important, en particulier avec les collections Scala.
J'ai créé une ligne unique que j'insère en haut de chaque nouvelle feuille de travail Scala pour simplifier cela (et je n'ai donc pas à faire tout l'exercice d'importation de bibliothèque externe pour un besoin très simple). Si vous êtes un stickler et que vous remarquez qu'il s'agit techniquement de deux lignes, c'est uniquement pour le rendre plus lisible dans ce forum. C'est une seule ligne dans ma feuille de calcul Scala.
Et l'utilisation est simplement:
Cela me permet de fournir éventuellement le nom du fichier si je veux avoir des fichiers supplémentaires au-delà de la valeur par défaut (qui écrase complètement le fichier à chaque fois que la méthode est appelée).
Donc, la deuxième utilisation est simplement:
Prendre plaisir!
la source
Utilisez des opérations d'ammonite bibliothèque d' . La syntaxe est très minimale, mais l'étendue de la bibliothèque est presque aussi large que ce à quoi on pourrait s'attendre en tentant une telle tâche dans un langage de script shell comme bash.
Sur la page à laquelle j'ai lié, il montre de nombreuses opérations que l'on peut faire avec la bibliothèque, mais pour répondre à cette question, voici un exemple d'écriture dans un fichier
la source
Grâce à la magie du point-virgule, vous pouvez créer tout ce que vous aimez en une seule ligne.
la source