Do czytania plików w Scali jest
Source.fromFile("file.txt").mkString
Czy istnieje równoważny i zwięzły sposób zapisania ciągu znaków do pliku?
Większość języków obsługuje coś takiego. Moim ulubionym jest Groovy:
def f = new File("file.txt")
// Read
def s = f.text
// Write
f.text = "file contents"
Chciałbym użyć kodu dla programów obejmujących od pojedynczego wiersza do krótkiej strony kodu. Korzystanie z własnej biblioteki nie ma tutaj sensu. Oczekuję, że nowoczesny język pozwoli mi wygodnie napisać coś do pliku.
Są posty podobne do tego, ale nie odpowiadają one dokładnie na moje pytanie lub dotyczą starszych wersji Scali.
Na przykład:
Odpowiedzi:
Zwięzła jedna linia:
źródło
write()
,close
nigdy nie zostanie wywołany, a plik nie zostanie zamknięty.PrintWriter
używa również domyślnego kodowania systemowego, co jest bardzo niekorzystne dla przenośności. I wreszcie, to podejście generuje oddzielną klasę specjalnie dla tej linii (jednak biorąc pod uwagę, że Scala już generuje mnóstwo klas nawet dla prostego kodu, nie jest to sama w sobie wada).new PrintWriter(tmpFile) { try {write(debugmsg)} finally {close} }
close()
, myślęnew java.io.PrintWriter("/tmp/hello") { write("file contents"); close }
To dziwne, że nikt nie zasugerował operacji NIO.2 (dostępnych od wersji Java 7):
Myślę, że jest to zdecydowanie najprostszy, najłatwiejszy i najbardziej idiomatyczny sposób, który nie wymaga żadnych zależności poza samą Javą.
źródło
reflect.io.File.writeAll(contents)
. Czemu? Trzy wiersze w przypadku dołączenia dwóch instrukcji importu. Może IDE robi to automatycznie, ale jeśli w REPL nie jest to takie proste.Files.write
przyjmuje równieżjava.lang.Iterable
jako drugi argument i możemy go uzyskać ze ScaliIterable
, czyli prawie dowolnego typu kolekcji, używając konwertera: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)
Oto zwięzły, jednowierszowy tekst z użyciem pliku Reflect.io., który działa ze Scala 2.12:
Alternatywnie, jeśli chcesz użyć bibliotek Java, możesz zrobić to hack:
źródło
Some
/foreach
Kombi jest nieco funky, ale chodzi o rzecz bez try / catch / finally.Some
/foreach
Hack jest dokładnie, dlaczego wielu ludzi nienawidzi Scala dla nieczytelnym kodem to powoduje hakerów do produktów.scala.tootls.nsc.io.File
jest aliasem dlareflect.io.File
. Wciąż wewnętrzny interfejs API, ale przynajmniej trochę krótszy.Jeśli podoba Ci się składnia Groovy, możesz użyć wzorca projektowego Pimp-My-Library, aby przenieść ją do Scala:
Będzie działać zgodnie z oczekiwaniami:
źródło
źródło
#>
, co to!
robi?echo
narzędzia wiersza poleceń.Mikro biblioteka, którą napisałem: https://github.com/pathikrit/better-files
lub
źródło
Możesz łatwo użyć Apache File Utils . Spójrz na funkcję
writeStringToFile
. Używamy tej biblioteki w naszych projektach.źródło
Jeden ma również ten format, który jest zwięzły, a podstawowa biblioteka jest pięknie napisana (patrz kod źródłowy):
źródło
Myślę, że jest to wystarczająco zwięzłe:
źródło
Możesz to zrobić za pomocą mieszanki bibliotek Java i Scala. Będziesz mieć pełną kontrolę nad kodowaniem znaków. Niestety, uchwyty plików nie zostaną poprawnie zamknięte.
źródło
Wiem, że to nie jest jedna linijka, ale o ile wiem, rozwiązuje ona kwestie bezpieczeństwa;
Jeśli nie dbałeś o obsługę wyjątków, możesz napisać
źródło
AKTUALIZACJA: od tego czasu stworzyłem bardziej efektywne rozwiązanie, nad którym omówiłem tutaj: https://stackoverflow.com/a/34277491/501113
Coraz częściej pracuję nad arkuszem Scala w środowisku Scala IDE dla Eclipse (i uważam, że w IntelliJ IDEA jest coś równoważnego). W każdym razie muszę być w stanie wykonać jedną linijkę, aby wydrukować część zawartości, gdy otrzymuję komunikat „Wyjście przekracza granicę odcięcia”. wiadomość, jeśli robię coś ważnego, szczególnie z kolekcjami Scala.
Wymyśliłem jedną linijkę, którą wstawiam na górze każdego nowego arkusza Scala, aby to uprościć (i dlatego nie muszę wykonywać całego ćwiczenia importowania biblioteki zewnętrznej z bardzo prostej potrzeby). Jeśli jesteś sticklerem i zauważysz, że technicznie jest to dwie linie, to tylko po to, aby uczynić ją bardziej czytelną na tym forum. To jest pojedyncza linia w moim arkuszu Scala.
A użycie jest po prostu:
Dzięki temu mogę opcjonalnie podać nazwę pliku, jeśli chcę mieć dodatkowe pliki poza domyślnymi (co całkowicie zastępuje plik za każdym razem, gdy wywoływana jest metoda).
Tak więc drugie użycie to po prostu:
Cieszyć się!
źródło
Użyj biblioteki ammonite ops . Składnia jest bardzo minimalna, ale rozpiętość biblioteki jest prawie tak szeroka, jak można by się spodziewać po wykonaniu takiego zadania w języku skryptowym powłoki, takim jak bash.
Na stronie, do której się łącze, pokazuje wiele operacji, które można wykonać z biblioteką, ale aby odpowiedzieć na to pytanie, oto przykład zapisu do pliku
źródło
Dzięki magii średnika możesz zrobić wszystko, co ci się podoba, w jednej linii.
źródło