Bagaimana cara membaca file di Groovy menjadi string?

309

Saya perlu membaca file dari sistem file dan memuat seluruh konten ke dalam string di pengontrol asyik, apa cara termudah untuk melakukannya?

orang rafia
sumber

Jawaban:

507
String fileContents = new File('/path/to/file').text

Jika Anda perlu menentukan pengkodean karakter, gunakan yang berikut ini sebagai gantinya:

String fileContents = new File('/path/to/file').getText('UTF-8')
Dónal
sumber
6
Itulah keindahan Groovy :)
Igor
1
Apakah saya harus menjalankan beberapa pernyataan close () atau akankah pembaca ditutup dengan metode getText ()?
das Keks
6
@dasKeks Saya pikir aman untuk mengasumsikan bahwa implementasi metode ini menutup semua sumber daya yang diperlukan. Bagaimanapun, Anda tidak memiliki akses ke pembaca apa pun yang dapat dibuat, jadi Anda tidak dapat menutupnya
Dónal
Saya ingin menyebutkan bahwa ini berfungsi bahkan jika Fileobjek berasal dari toples java biasa. Saya tidak yakin apakah mungkin Groovy memiliki Filekelas khusus dengan textatribut, atau sesuatu, tetapi tampaknya tidak masalah dari mana Fileobjek itu berasal, apakah itu dipakai oleh kode Groovy atau kode Java.
ArtOfWarfare
1
@roens Itu tidak masuk akal. Saya menduga ada beberapa faktor lain dalam campuran seperti Anda memiliki variabel lokal yang menyembunyikan bidang atau sesuatu seperti itu.
Jeff Scott Brown
77

Cara terpendek memang adil

String fileContents = new File('/path/to/file').text

tetapi dalam kasus ini Anda tidak memiliki kontrol tentang bagaimana byte dalam file ditafsirkan sebagai karakter. AFAIK groovy mencoba menebak penyandian di sini dengan melihat konten file.

Jika Anda ingin pengkodean karakter tertentu, Anda dapat menentukan nama rangkaian karakter dengan

String fileContents = new File('/path/to/file').getText('UTF-8')

Lihat API APIFile.getText(String) untuk referensi lebih lanjut.

Jaetzold
sumber
7
+1 untuk merekomendasikan versi yang mengambil parameter penyandian. Dataran someFile.texttidak membuat dugaan yang cerdas, itu hanya menggunakan platform encoding default (biasanya UTF-8 pada Linux modern, tetapi sesuatu seperti windows-1252 atau MacRoman pada Windows / Mac OS, kecuali jika Anda menimpanya -Dfile.encoding=...)
Ian Roberts
Paling tidak dalam versi terbaru Groovy, tebakan dilakukan menggunakan CharsetToolkit yang membuat tebakan cerdas.
Matthijs Bierman
53

Variasi sedikit ...

new File('/path/to/file').eachLine { line ->
  println line
}
linus1412
sumber
5
Benar, tapi itu masih idiom yang berguna untuk menangkap "sebagai catatan".
Steve Byrne
Ini hal yang baik untuk melihat ini - membuat pemrosesan file baris demi baris sepele.
Bill K
12

cara termudah adalah

new File(filename).getText()

yang berarti Anda bisa melakukan:

new File(filename).text

Yang Mulia Gonzo
sumber
12

Dalam kasus saya new File()tidak bekerja, itu menyebabkan FileNotFoundExceptionketika dijalankan dalam pekerjaan pipa Jenkins. Kode berikut memecahkan masalah ini, dan bahkan lebih mudah menurut saya:

def fileContents = readFile "path/to/file"

Saya masih belum memahami perbedaan ini sepenuhnya, tetapi mungkin itu akan membantu orang lain dengan masalah yang sama. Mungkin pengecualian disebabkan karena new File()membuat file pada sistem yang mengeksekusi kode asyik, yang merupakan sistem yang berbeda dari yang berisi file yang ingin saya baca.

P Kuijpers
sumber
Apakah langkah readFile berfungsi dengan baik untuk Anda? bagi saya itu berfungsi tetapi itu membuat '' satu kutipan pada beberapa kata, saya tidak mengerti!
codeGeass
Ini berfungsi dengan baik untuk saya, dan tidak menemukan tanda kutip yang tidak saya tempatkan sendiri (saya kira maksud Anda adalah tanda kutip dalam isi file). Mungkin layak untuk membuat pertanyaan baru untuk ini? Dalam hal ini, cobalah untuk menentukan dalam kasus mana kutipan muncul dan di mana tepatnya.
P Kuijpers
2
Bekerja untuk jenkins. karena readFile adalah kata kunci internal, dan tidak memerlukan impor atau persetujuan tambahan dari jenkins-admin. Seluruh file dapat dibaca dalam String var dan kemudian dicetak melalui kode di bawah ini: String fp_f = readFile("any_file") if (fp.length()) { currentBuild.description = fp } Juga, jika file tidak ditemukan maka ada kesalahan.
ashish
1
Btw. alasan untuk ini adalah, bahwa File baru () mencari file di komputer Anda, seperti readFile di Jenkins terlihat di kotak pasir asyik dari java vm di mana hal-hal pipa Anda mungkin berjalan ... Juga Anda diperbolehkan menggunakan readfile di sandboxed pipa tetapi menggunakan File () secara default tidak diizinkan, File Anda harus masuk daftar putih dalam pengaturan Jenkins sebelum Anda dapat menggunakannya.
Cyborg-X1
2

Di sini Anda dapat menemukan cara lain untuk melakukan hal yang sama.

Baca file.

File file1 = new File("C:\Build\myfolder\myTestfile.txt");
def String yourData = file1.readLines();

Baca file lengkap.

File file1 = new File("C:\Build\myfolder\myfile.txt");
def String yourData= file1.getText();

Baca file Line Bye Line.

File file1 = new File("C:\Build\myfolder\myTestfile.txt");
for (def i=0;i<=30;i++) // specify how many line need to read eg.. 30
{
 log.info file1.readLines().get(i)

}

Buat file baru.

new File("C:\Temp\FileName.txt").createNewFile();
shashi singh
sumber
Saya tidak yakin Anda perlu defketika Anda menentukan jenisnya.
Victor M Herasme Perez
Tanpa menggunakan kode def akan bekerja, saya punya kebiasaan untuk mendefinisikan variabel-variabel itu!
shashi singh