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?

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')

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.


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
}

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

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.


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();

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.