Como ler um arquivo no Groovy em uma string?

309

Preciso ler um arquivo do sistema de arquivos e carregar todo o conteúdo em uma string em um controlador groovy. Qual é a maneira mais fácil de fazer isso?

rafiano
fonte

Respostas:

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

Se você precisar especificar a codificação de caracteres, use o seguinte:

String fileContents = new File('/path/to/file').getText('UTF-8')
Dónal
fonte
6
Essa é a beleza do Groovy :)
Igor
1
Preciso executar algumas instruções close () ou o leitor será fechado pelo método getText ()?
das Keks
6
@dasKeks Eu acho que é seguro assumir que a implementação desse método fecha todos os recursos necessários. De qualquer forma, você não tem acesso a qualquer leitor que podem ser criadas, para que você não pode fechá-lo
Donal
Eu gostaria de mencionar que isso funciona mesmo que o Fileobjeto tenha sido originado de um jar Java comum. Eu não tinha certeza se talvez o Groovy tivesse sua própria Fileclasse especial com o textatributo, ou algo assim, mas parece que não importa de onde o Fileobjeto vem, seja instanciado pelo código Groovy ou código Java.
ArtOfWarfare 6/03/2017
1
@roens Isso não faz sentido. Eu suspeito que há algum outro fator na mistura como se você tivesse uma variável local que estava ocultando um campo ou algo assim.
Jeff Scott Brown
77

O caminho mais curto é de fato apenas

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

mas, nesse caso, você não tem controle sobre como os bytes no arquivo são interpretados como caracteres. O AFAIK groovy tenta adivinhar a codificação aqui, observando o conteúdo do arquivo.

Se você deseja uma codificação de caracteres específica, pode especificar um nome de conjunto de caracteres com

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

Consulte os documentos da APIFile.getText(String) para obter mais referências.

jaetzold
fonte
7
+1 por recomendar a versão que aceita um parâmetro de codificação. A planície someFile.textnão faz um palpite inteligente, simplesmente usa a codificação padrão da plataforma (geralmente UTF-8 nos Linux modernos, mas algo como windows-1252 ou MacRoman no Windows / Mac OS, a menos que você a tenha substituído -Dfile.encoding=...)
Ian Roberts
Nas versões recentes do Groovy, pelo menos, o palpite é feito usando o CharsetToolkit, que faz um palpite inteligente.
Matthijs Bierman
53

Uma ligeira variação ...

new File('/path/to/file').eachLine { line ->
  println line
}
linus1412
fonte
5
É verdade, mas ainda é um idioma útil para capturar "para o registro".
Steve Byrne
É bom ver isso - torna o processamento de um arquivo linha por linha trivial.
Bill K
12

a maneira mais fácil seria

new File(filename).getText()

o que significa que você pode fazer:

new File(filename).text

Reverendo Gonzo
fonte
12

No meu caso new File(), não funciona, causa FileNotFoundExceptionquando executado em um trabalho de pipeline do Jenkins. O código a seguir resolveu isso e é ainda mais fácil na minha opinião:

def fileContents = readFile "path/to/file"

Ainda não entendo completamente essa diferença, mas talvez isso ajude outras pessoas com o mesmo problema. Possivelmente, a exceção foi causada porque new File()cria um arquivo no sistema que executa o código do groovy, que era um sistema diferente daquele que contém o arquivo que eu queria ler.

P Kuijpers
fonte
A etapa readFile funciona bem para você? para mim funciona, mas faz '' aspas simples em algumas palavras, eu não entendo!
codeGeass
Funciona bem para mim e não encontrou nenhuma citação que eu não coloquei (acho que você quer dizer aspas no conteúdo do arquivo). Talvez valha a pena criar uma nova pergunta para isso? Nesse caso, tente especificar em quais casos as aspas serão exibidas e onde exatamente.
P: Kuijpers
2
Trabalhos para Jenkins. como readFile é uma palavra-chave interna e não precisa de nenhuma importação ou aprovação extra da jenkins-admin. O arquivo inteiro pode ser lido na String var e depois impresso através do código abaixo: String fp_f = readFile("any_file") if (fp.length()) { currentBuild.description = fp } Além disso, se o arquivo não for encontrado, haverá um erro.
ashish
1
Btw. a razão para isso é que o novo File () procura arquivos no seu computador, pois o readFile no Jenkins procura na área restrita do java vm onde provavelmente está sendo executado o material do pipeline ... Além disso, você pode usar o readfile na área restrita pipelines, mas o uso de File () não é permitido por padrão. Você precisará da lista de permissões nas configurações do Jenkins antes de poder usá-lo.
Cyborg-X1
2

Aqui você pode encontrar outra maneira de fazer o mesmo.

Leia o arquivo.

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

Leia o arquivo completo.

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

Leia o arquivo 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)

}

Crie um novo arquivo.

new File("C:\Temp\FileName.txt").createNewFile();
shashi singh
fonte
Não tenho certeza de que você precisa defquando especifica o tipo.
Victor M Herasme Perez
Sem usar o código def funcionará, eu tenho o hábito de definir essas variáveis!
Shashi singh