Як прочитати файл у Groovy у рядок?


309

Мені потрібно прочитати файл із файлової системи та завантажити весь вміст у рядок у грубому контролері, який найпростіший спосіб це зробити?

Відповіді:


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

Якщо вам потрібно вказати кодування символів, скористайтеся наступним:

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

6
Ось така краса Гроови :)
Ігор

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

Для подальшого ознайомлення див. Документи Документи APIFile.getText(String) .


7
+1 для рекомендування версії, яка приймає параметр кодування. Звичайна someFile.textне здогадується, вона просто використовує кодування платформи за замовчуванням (як правило, UTF-8 на сучасних Linux, але щось на кшталт Windows-1252 або MacRoman в Windows / Mac OS, якщо ви не перекрили це -Dfile.encoding=...)
Ian Робертс

Принаймні, в останніх версіях Groovy здогадка робиться за допомогою CharsetToolkit, який робить інтелектуальну здогадку.
Маттайс Бірман

53

Незначна зміна ...

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

5
Щоправда, але це все-таки корисна ідіома для зйомки "для запису".
Стів Бірн

Це добре бачити - робить обробку файлу рядком за рядком тривіальним.
Білл К


12

У моєму випадку new File()не працює, це призводить до FileNotFoundExceptionзапуску в трубопроводі Дженкінса. Наступний код вирішив це, і на мою думку ще простіше:

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. Причина цього полягає в тому, що новий File () шукає файли на вашому комп’ютері, як readFile в Jenkins дивиться в бурхливій пісочниці Java VM, де, напевно, працює ваш конвеєрний матеріал ... Також вам дозволяється використовувати readfile в sandboxed трубопроводи, але використання файлу () за замовчуванням не дозволено. Файл вам доведеться додати до списку в налаштуваннях Дженкінса, перш ніж використовувати його.
Кіборг-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коли ви вказуєте тип.
Victor M Herasme Perez

Без використання def- коду буде працювати, я маю звичку визначати ці змінні!
шаші сингх
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.