Groovy'deki bir dosyayı bir dizeye nasıl okurum?


309

Dosya sisteminden bir dosya okumak ve groovy denetleyicide bir dizeye tüm içeriği yüklemek gerekir, bunu yapmanın en kolay yolu nedir?

Yanıtlar:


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

Karakter kodlamasını belirtmeniz gerekiyorsa, bunun yerine aşağıdakileri kullanın:

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

6
Bu Groovy güzelliği :)
Igor

1
Bazı close () deyimlerini yürütmem gerekiyor mu yoksa okuyucu getText () yöntemi tarafından kapatılacak mı?
das Keks

6
@dasKeks Bu yöntemin uygulanmasının gerekli kaynakları kapattığını varsaymanın güvenli olduğunu düşünüyorum. Neyse, sen oluşturulabilir herhangi okuyucuya erişimi yoktur bu yüzden yapamam yakın
Donal

FileNesnenin sıradan bir java kavanozundan kaynaklansa bile bunun işe yaradığını belirtmek isterim . Belki de Groovy'nin özniteliği olan kendi özel Filesınıfına sahip olup olmadığından emin değildim text, ancak FileGroovy kodu veya Java kodu ile somutlaştırılmış olsun , nesnenin nereden geldiğinin önemi yok gibi görünüyor .
ArtOfWarfare

1
@roens Bu hiç mantıklı değil. Karışımda, bir alanı veya bunun gibi bir şeyi gizleyen yerel bir değişkeniniz var gibi başka bir faktör olduğundan şüpheleniyorum.
Jeff Scott Brown

77

En kısa yol gerçekten

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

ancak bu durumda dosyadaki baytların karakter olarak nasıl yorumlandığı konusunda hiçbir denetiminiz yoktur. AFAIK groovy, dosya içeriğine bakarak buradaki kodlamayı tahmin etmeye çalışır.

Belirli bir karakter kodlaması istiyorsanız şununla bir karakter kümesi adı belirtebilirsiniz:

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

Daha fazla referans için API belgelerineFile.getText(String) bakın .


7
Kodlama parametresi alan sürümü önermek için +1. Ova someFile.textakıllı bir tahmin yapmaz, sadece platform varsayılan kodlamasını kullanır (genellikle modern Linux'larda UTF-8, ancak geçersiz kılmadığınız sürece Windows / Mac OS'de windows-1252 veya MacRoman gibi bir şey -Dfile.encoding=...)
Ian Roberts

En azından Groovy'nin son sürümlerinde, tahmin akıllı bir tahmin yapan CharsetToolkit kullanılarak yapılır .
Matthijs Bierman

53

Küçük bir varyasyon ...

new File('/path/to/file').eachLine { line ->
  println line
}

5
Doğru, ama yine de "kayıt için" yakalamak için yararlı bir deyim.
Steve Byrne

Bunu görmek iyi bir şey - bir dosyayı satır satır önemsiz hale getiriyor.
Bill K


12

Benim durumumda new File()çalışmıyor FileNotFoundException, bir Jenkins boru hattı işinde bir zaman çalıştırmak neden olur . Aşağıdaki kod bunu çözdü ve bence daha da kolay:

def fileContents = readFile "path/to/file"

Bu farkı hala tam olarak anlayamıyorum, ama belki de aynı sıkıntıya sahip olan herkese yardımcı olacaktır. Muhtemelen istisna, new File()okumak istediğim dosyayı içeren sistemden farklı bir sistem olan groovy kodunu yürüten sistemde bir dosya oluşturması nedeniyle ortaya çıktı.


ReadFile adımı sizin için uygun mu? benim için işe yarıyor ama '' bazı kelimeler üzerinde tek tırnak yapıyor, anlamıyorum!
codeGeass

Benim için iyi çalışıyor ve kendimi yerleştirmediğim herhangi bir alıntıyla karşılaşmadım (sanırım dosya içeriğinde alıntılar demek istediniz). Belki bunun için yeni bir soru yaratmaya değer? Bu durumda, hangi durumlarda tırnakların tam olarak nerede görüneceğini belirtmeye çalışın.
P Kuijpers

2
Cenkins için çalışır. readFile dahili bir anahtar kelimedir ve jenkins-admin'den herhangi bir içe aktarma veya ek onay gerektirmez. Tüm dosya String var içinde okunabilir ve daha sonra aşağıdaki kodla yazdırılabilir: String fp_f = readFile("any_file") if (fp.length()) { currentBuild.description = fp } Ayrıca, dosya bulunamazsa hata vardır.
ashish

1
Btw. Bunun nedeni, Jenkins'teki readFile, boru hattı öğelerinizin muhtemelen çalıştığı java vm'nin harika sanal alanına baktığı için yeni File () bilgisayarınızdaki dosyaları arar. Ayrıca, korumalı alanda readfile kullanmanıza izin verilir pipeline'ları oluşturuyor ancak varsayılan olarak File () işlevine izin verilmiyor, File'ı kullanmadan önce Jenkins ayarlarında beyaz listeye eklemeniz gerekecek.
Cyborg-X1

2

Burada aynı şeyi yapmanın başka bir yolunu bulabilirsiniz.

Dosyayı oku.

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

Tam dosyayı okuyun.

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

Dosya Bye Line okuyun.

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)

}

Yeni bir dosya oluşturun.

new File("C:\Temp\FileName.txt").createNewFile();

defTürü belirttiğinizde ihtiyacınız olduğundan emin değilim .
Victor M Herasme Perez

Def kodu kullanmadan çalışacak, ben bu değişken tanımlamak için bir alışkanlığı var!
shashi singh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.