Untuk membaca file di Scala, ada
Source.fromFile("file.txt").mkString
Apakah ada cara yang setara dan ringkas untuk menulis string ke file?
Sebagian besar bahasa mendukung sesuatu seperti itu. Favorit saya adalah Groovy:
def f = new File("file.txt")
// Read
def s = f.text
// Write
f.text = "file contents"
Saya ingin menggunakan kode untuk program mulai dari satu baris hingga satu halaman kode pendek. Harus menggunakan perpustakaan Anda sendiri tidak masuk akal di sini. Saya berharap bahasa modern memungkinkan saya menulis sesuatu ke file dengan nyaman.
Ada posting yang mirip dengan ini, tetapi mereka tidak menjawab pertanyaan saya yang tepat atau berfokus pada versi Scala yang lebih lama.
Sebagai contoh:
Jawaban:
Satu baris ringkas:
sumber
write()
,close
tidak akan pernah dipanggil, dan file tidak akan ditutup.PrintWriter
juga menggunakan pengkodean sistem default, yang sangat buruk untuk portabilitas. Dan akhirnya, pendekatan ini menghasilkan kelas terpisah khusus untuk baris ini (namun, mengingat bahwa Scala sudah menghasilkan banyak kelas bahkan untuk kode sederhana, ini bukan kelemahan dalam dirinya sendiri).new PrintWriter(tmpFile) { try {write(debugmsg)} finally {close} }
close()
, saya pikirnew java.io.PrintWriter("/tmp/hello") { write("file contents"); close }
Sungguh aneh bahwa tidak ada yang menyarankan operasi NIO.2 (tersedia sejak Java 7):
Saya pikir ini sejauh ini adalah cara yang paling sederhana dan termudah dan paling idiomatis, dan tidak memerlukan dependensi dari Java itu sendiri.
sumber
reflect.io.File.writeAll(contents)
. Mengapa? Tiga baris saat Anda memasukkan dua pernyataan impor. Mungkin IDE melakukannya untuk Anda secara otomatis tetapi jika dalam REPL itu tidak mudah.Files.write
juga menerimajava.lang.Iterable
sebagai argumen kedua, dan kita dapat memperolehnya dari ScalaIterable
, yaitu hampir semua jenis koleksi, menggunakan konverter: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)
Berikut ini adalah one-liner ringkas yang menggunakan reflect.io.file, ini bekerja dengan Scala 2.12:
Atau, jika Anda ingin menggunakan perpustakaan Java Anda bisa melakukan hack ini:
sumber
Some
/foreach
combo adalah yang funky sedikit, tapi ia datang dengan manfaat tidak mencoba / menangkap / akhirnya.Some
/foreach
hack adalah alasan mengapa banyak orang membenci Scala karena kode yang tidak terbaca yang bisa dihasilkan oleh peretas.scala.tootls.nsc.io.File
adalah alias untukreflect.io.File
. Masih internal API, tetapi setidaknya sedikit lebih pendek.Jika Anda menyukai sintaks Groovy, Anda dapat menggunakan pola desain Pimp-My-Library untuk membawanya ke Scala:
Ini akan berfungsi seperti yang diharapkan:
sumber
sumber
#>
, apa fungsinya!
?echo
alat baris perintah .Perpustakaan mikro yang saya tulis: https://github.com/pathikrit/better-files
atau
sumber
Anda dapat dengan mudah menggunakan Utilitas File Apache . Lihatlah fungsinya
writeStringToFile
. Kami menggunakan perpustakaan ini dalam proyek kami.sumber
Seseorang juga memiliki format ini, yang ringkas dan pustaka yang mendasarinya ditulis dengan indah (lihat kode sumber):
sumber
Ini cukup ringkas, saya kira:
sumber
Anda dapat melakukan ini dengan campuran perpustakaan Java dan Scala. Anda akan memiliki kontrol penuh atas pengkodean karakter. Namun sayangnya, file handle tidak akan ditutup dengan benar.
sumber
Saya tahu itu bukan satu baris, tapi itu memecahkan masalah keselamatan sejauh yang saya tahu;
Jika Anda tidak peduli tentang penanganan pengecualian maka Anda dapat menulis
sumber
UPDATE: Sejak itu saya telah membuat solusi yang lebih efektif yang telah saya uraikan di sini: https://stackoverflow.com/a/34277491/501113
Saya menemukan diri saya semakin banyak bekerja di Lembar Kerja Scala dalam IDE Scala untuk Eclipse (dan saya percaya ada sesuatu yang setara di IntelliJ IDEA). Lagi pula, saya harus bisa melakukan satu-liner untuk menampilkan beberapa konten karena saya mendapatkan "Output melebihi batas cutoff." pesan jika saya melakukan sesuatu yang signifikan, terutama dengan koleksi Scala.
Saya datang dengan satu-liner yang saya masukkan ke bagian atas setiap Lembar Kerja Scala baru untuk menyederhanakan ini (dan jadi saya tidak harus melakukan seluruh latihan impor perpustakaan eksternal untuk kebutuhan yang sangat sederhana). Jika Anda ngotot dan memperhatikan bahwa secara teknis ada dua baris, itu hanya agar lebih mudah dibaca di forum ini. Ini adalah satu baris di Lembar Kerja Scala saya.
Dan penggunaannya sederhana:
Ini memungkinkan saya untuk secara opsional memberikan nama file jika saya ingin memiliki file tambahan di luar standar (yang sepenuhnya menimpa file setiap kali metode dipanggil).
Jadi, penggunaan kedua adalah:
Nikmati!
sumber
Gunakan ops ammon perpustakaan . Sintaksnya sangat minim, tetapi luasnya perpustakaan hampir seluas apa yang diharapkan dari mencoba tugas seperti itu dalam bahasa skrip shell seperti bash.
Pada halaman yang saya tautkan, ini menunjukkan banyak operasi yang dapat dilakukan dengan perpustakaan, tetapi untuk menjawab pertanyaan ini, ini adalah contoh penulisan ke file
sumber
Melalui keajaiban titik koma, Anda dapat membuat apa pun yang Anda suka satu garis.
sumber