Как прочитать файл в Groovy в строку?


309

Мне нужно прочитать файл из файловой системы и загрузить все содержимое в строку в Groovy-контроллере. Какой самый простой способ сделать это?

Ответы:


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

Если вам нужно указать кодировку символов, используйте следующее:

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

6
Это красота Groovy :)
Игорь

1
Нужно ли выполнять некоторые операторы close () или читатель будет закрыт методом getText ()?
дас Кекс

6
@dasKeks Я думаю, можно с уверенностью предположить, что реализация этого метода закрывает все необходимые ресурсы. В любом случае, у вас нет доступа к любому читателю, который может быть создан, поэтому вы не можете закрыть его
Dónal

Я хотел бы отметить, что это работает, даже если Fileобъект возник из обычной java-банки. Я не был уверен, что, возможно, у Groovy есть свой собственный специальный Fileкласс с textатрибутом, или что-то в этом роде, но кажется, что не имеет значения, откуда Fileберется объект, создается ли его экземпляр с помощью кода Groovy или кода Java.
ArtOfWarfare

1
@roens Это не имеет смысла. Я подозреваю, что в миксе есть другой фактор, например, что у вас есть локальная переменная, которая скрывает поле или что-то в этом роде.
Джефф Скотт Браун

77

Самый короткий путь действительно

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

но в этом случае вы не можете контролировать, как байты в файле интерпретируются как символы. AFAIK groovy пытается угадать кодировку, просматривая содержимое файла.

Если вы хотите определенную кодировку символов, вы можете указать имя кодировки с помощью

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

См. API документыFile.getText(String) для дальнейшего использования.


7
+1 за рекомендацию версии, которая принимает параметр кодирования. Простая someFile.textне делает разумного предположения, она просто использует кодировку платформы по умолчанию (обычно UTF-8 в современных Linux, но что-то вроде windows-1252 или MacRoman в Windows / Mac OS, если вы не переопределили ее -Dfile.encoding=...)
Ян Робертс

В последних версиях Groovy, по крайней мере, предположение делается с помощью CharsetToolkit, который делает интеллектуальное предположение.
Маттис Берман

53

Небольшое изменение ...

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

5
Правда, но это все еще полезная идиома для записи "для записи".
Стив Бирн

Хорошо видеть это - делает обработку файла построчно.
Билл К


12

В моем случае new File()это не работает, это вызывает FileNotFoundExceptionзапуск в конвейерном задании Jenkins. Следующий код решил это, и, на мой взгляд, еще проще:

def fileContents = readFile "path/to/file"

Я до сих пор не понимаю эту разницу полностью, но, возможно, это поможет кому-то еще с такой же проблемой. Возможно, исключение было вызвано тем, что в системе new File()создается файл, который выполняет код groovy, который отличался от того, который содержит файл, который я хотел прочитать.


Шаг readFile работает у вас нормально? для меня это работает, но это делает '' одинарные кавычки на некоторые слова, я не понимаю!
codeGeass

Он отлично работает для меня, и я не нашел ни одной кавычки, которые я сам себе не поместил (наверное, вы имеете в виду кавычки в содержимом файла). Может стоит создать новый вопрос для этого? В этом случае попробуйте указать, в каких случаях появляются кавычки и где именно.
P Kuijpers

2
Работает на Дженкинса. поскольку readFile является внутренним ключевым словом и не нуждается в импорте или дополнительном одобрении от jenkins-admin. Весь файл можно прочитать в String var, а затем распечатать с помощью кода ниже: String fp_f = readFile("any_file") if (fp.length()) { currentBuild.description = fp } Кроме того, если файл не найден, возникает ошибка.
Ашиш

1
Btw. причина в том, что new File () ищет файлы на вашем компьютере, а readFile в Jenkins ищет в groovy песочнице java vm, где, вероятно, работает ваш конвейер ... Также вы можете использовать readfile в песочнице конвейеры, но использование File () по умолчанию не разрешено. Файл, который вы должны будете внести в белый список в настройках Jenkins, прежде чем вы сможете его использовать.
Киборг-X1

2

Здесь вы можете найти другой способ сделать то же самое.

Читать файл.

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

Читать полный файл.

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

Читать файл 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)

}

Создать новый файл.

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

Я не уверен, что вам нужно, defкогда вы указываете тип.
Виктор М Herasme Perez

Без использования кода def будет работать, у меня есть привычка определять эти переменные!
Шаши Сингх
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.