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.