Jak odczytać plik Groovy na ciąg?


309

Muszę odczytać plik z systemu plików i załadować całą zawartość do ciągu w świetnym kontrolerze, jaki jest najłatwiejszy sposób?

Odpowiedzi:


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

Jeśli musisz określić kodowanie znaków, użyj następujących poleceń:

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

6
To jest piękno Groovy :)
Igor

1
Czy muszę wykonywać niektóre instrukcje close (), czy też czytnik zostanie zamknięty za pomocą metody getText ()?
das Keks

6
@dasKeks Myślę, że można bezpiecznie założyć, że wdrożenie tej metody zamyka wszelkie niezbędne zasoby. W każdym razie nie masz dostępu do żadnego czytnika, który mógłby zostać utworzony, więc nie możesz go zamknąć
Dónal

Chciałbym wspomnieć, że to działa, nawet jeśli Fileobiekt pochodzi ze zwykłego słoika java. Nie byłem pewien, czy może Groovy ma własną specjalną Fileklasę z tym textatrybutem, czy coś, ale wydaje się, że nie ma znaczenia, skąd Filepochodzi obiekt, czy jest on tworzony przez kod Groovy czy kod Java.
ArtOfWarfare

1
@roens To nie ma sensu. Podejrzewam, że w miksie jest jeszcze jeden czynnik, taki jak zmienna lokalna, która ukrywała pole lub coś w tym rodzaju.
Jeff Scott Brown,

77

Najkrótsza droga jest rzeczywiście sprawiedliwa

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

ale w tym przypadku nie masz kontroli nad tym, jak bajty w pliku są interpretowane jako znaki. AFAIK groovy próbuje odgadnąć kodowanie tutaj, patrząc na zawartość pliku.

Jeśli chcesz kodować określony znak, możesz podać nazwę zestawu znaków za pomocą

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

Zobacz dokumentację API wFile.getText(String) celu uzyskania dalszych informacji.


7
+1 za zalecenie wersji, która przyjmuje parametr kodowania. Zwykły someFile.textnie zgaduje w inteligentny sposób, po prostu używa domyślnego kodowania platformy (zwykle UTF-8 w nowoczesnych systemach Linux, ale coś takiego jak Windows-1252 lub MacRoman w systemie Windows / Mac OS, o ile go nie zastąpiłeś -Dfile.encoding=...)
Ian Roberts,

Przynajmniej w najnowszych wersjach Groovy zgadywanie odbywa się za pomocą CharsetToolkit, który inteligentnie zgaduje.
Matthijs Bierman

53

Niewielka zmiana ...

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

5
To prawda, ale wciąż przydatne jest przechwytywanie „na potrzeby nagrania”.
Steve Byrne,

Dobrze jest to zobaczyć - sprawia, że ​​przetwarzanie pliku linia po linii jest banalne.
Bill K,


12

W moim przypadku new File()nie działa, powoduje FileNotFoundExceptionuruchomienie w trybie potoku Jenkins. Poniższy kod rozwiązał ten problem i moim zdaniem jest jeszcze łatwiejszy:

def fileContents = readFile "path/to/file"

Nadal nie rozumiem tej różnicy całkowicie, ale może pomoże to każdemu, kto ma takie same problemy. Być może wyjątek został spowodowany, ponieważ new File()tworzy w systemie plik, który wykonuje świetny kod, który był innym systemem niż ten, który zawiera plik, który chciałem przeczytać.


Czy krok readFile działa dobrze? dla mnie to działa, ale sprawia, że ​​w niektórych słowach pojawiają się pojedyncze cytaty, nie rozumiem!
codeGeass

Działa dla mnie dobrze i nie spotkałem żadnych cytatów, których sam nie umieściłem (myślę, że masz na myśli cytaty w treści pliku). Może warto w tym celu utworzyć nowe pytanie? W takim przypadku spróbuj określić, w których przypadkach pojawiają się cytaty i gdzie dokładnie.
P Kuijpers,

2
Działa dla Jenkinsa. as readFile jest wewnętrznym słowem kluczowym i nie wymaga importu ani dodatkowej zgody jenkins-admin. Cały plik można odczytać w String var, a następnie wydrukować za pomocą poniższego kodu: String fp_f = readFile("any_file") if (fp.length()) { currentBuild.description = fp } Ponadto, jeśli plik nie zostanie znaleziony, oznacza to błąd.
ashish

1
Btw. Powodem tego jest to, że nowy File () szuka plików na twoim komputerze, tak jak readFile w Jenkins szuka w groovy sandbox vm java, w którym prawdopodobnie działają twoje potoki ... Również możesz używać readfile w sandboxed potoki, ale użycie File () jest domyślnie niedozwolone. Plik będzie musiał znajdować się na białej liście w ustawieniach Jenkinsa, zanim będzie można go użyć.
Cyborg-X1

2

Tutaj możesz znaleźć inny sposób na zrobienie tego samego.

Przeczytaj plik.

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

Przeczytaj pełny plik.

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

Czytaj plik Linia Bye Linia.

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)

}

Utwórz nowy plik.

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

Nie jestem pewien, czy potrzebujesz, defkiedy określisz typ.
Victor M. Herasme Perez

Bez użycia kodu def będzie działać, mam zwyczaj definiowania tych zmiennych!
shashi singh
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.