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?

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

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.


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
}

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

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.


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.