Làm thế nào để đọc một tệp trong Groovy thành một chuỗi?


309

Tôi cần đọc một tệp từ hệ thống tệp và tải toàn bộ nội dung vào một chuỗi trong bộ điều khiển Groovy, cách dễ nhất để làm điều đó là gì?

Câu trả lời:


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

Nếu bạn cần chỉ định mã hóa ký tự, thay vào đó hãy sử dụng mã sau:

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

6
Đó là vẻ đẹp của Groovy :)
Igor

1
Tôi có phải thực hiện một số câu lệnh close () hay trình đọc sẽ bị đóng bởi phương thức getText () không?
das Keks

6
@dasKeks Tôi nghĩ thật an toàn khi cho rằng việc triển khai phương pháp này sẽ đóng mọi tài nguyên cần thiết. Dù sao, bạn không có quyền truy cập vào bất kỳ độc giả nào có thể được tạo, vì vậy bạn không thể đóng nó
Dónal

Tôi muốn đề cập rằng điều này hoạt động ngay cả khi Fileđối tượng có nguồn gốc từ một jar java thông thường. Tôi không chắc liệu Groovy có Filelớp đặc biệt của riêng mình với textthuộc tính hay thứ gì đó không, nhưng có vẻ như nó không quan trọng Fileđối tượng đến từ đâu, cho dù nó được khởi tạo bởi mã Groovy hay mã Java.
ArtOfWarfare

1
@roens Điều đó vô nghĩa. Tôi nghi ngờ có một số yếu tố khác trong hỗn hợp như bạn có một biến cục bộ đang ẩn một trường hoặc một cái gì đó tương tự.
Jeff Scott Brown

77

Con đường ngắn nhất thực sự chỉ là

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

nhưng trong trường hợp này, bạn không có quyền kiểm soát về cách các byte trong tệp được hiểu là các ký tự. Groovy AFAIK cố gắng đoán mã hóa ở đây bằng cách xem nội dung tệp.

Nếu bạn muốn mã hóa ký tự cụ thể, bạn có thể chỉ định tên bộ ký tự với

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

Xem tài liệu API trênFile.getText(String) để tham khảo thêm.


7
+1 để đề xuất phiên bản có tham số mã hóa. Đồng bằng someFile.textkhông đưa ra dự đoán thông minh, nó chỉ đơn giản sử dụng mã hóa mặc định của nền tảng (thường là UTF-8 trên các Linux hiện đại, nhưng một cái gì đó như windows-1252 hoặc MacRoman trên Windows / Mac OS, trừ khi bạn đã ghi đè lên -Dfile.encoding=...)
Ian Roberts

Trong các phiên bản gần đây của Groovy, việc đoán được thực hiện bằng CharsetToolkit , điều này giúp đoán đúng.
Matthijs

53

Một biến thể nhỏ ...

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

5
Đúng, nhưng nó vẫn là một thành ngữ hữu ích để ghi lại "cho bản ghi".
Steve Byrne

Thật là một điều tốt khi thấy điều này - làm cho việc xử lý một dòng tệp theo dòng không đáng kể.
Bill K


12

Trong trường hợp của tôi new File()không hoạt động, nó gây ra FileNotFoundExceptionkhi chạy trong công việc đường ống Jenkins. Các mã sau đây đã giải quyết điều này, và theo tôi thậm chí còn dễ dàng hơn:

def fileContents = readFile "path/to/file"

Tôi vẫn không hiểu sự khác biệt này hoàn toàn, nhưng có lẽ nó sẽ giúp bất cứ ai khác gặp rắc rối tương tự. Có thể ngoại lệ đã được gây ra bởi vì new File()tạo một tệp trên hệ thống thực thi mã Groovy, đó là một hệ thống khác với hệ thống chứa tệp tôi muốn đọc.


Bước readFile có hoạt động tốt với bạn không? Đối với tôi nó hoạt động nhưng nó làm cho '' trích dẫn đơn trên một số từ, tôi không hiểu!
codeG ass

Nó hoạt động tốt đối với tôi và không gặp phải bất kỳ trích dẫn nào tôi không đặt cho mình (tôi đoán bạn có nghĩa là trích dẫn trong nội dung tệp). Có lẽ giá trị để tạo ra một câu hỏi mới cho điều này? Trong trường hợp đó, hãy cố gắng chỉ định trong trường hợp nào dấu ngoặc kép xuất hiện và chính xác ở đâu.
P Kuijpers

2
Hoạt động cho jenkins. vì readFile là một từ khóa nội bộ và không cần bất kỳ nhập hoặc phê duyệt bổ sung nào từ jenkins-admin. Toàn bộ tệp có thể được đọc trong Chuỗi var và sau đó được in qua mã bên dưới: String fp_f = readFile("any_file") if (fp.length()) { currentBuild.description = fp } Ngoài ra, nếu không tìm thấy tệp thì có lỗi.
tro bụi

1
Btw. Lý do cho điều này là, File () mới tìm kiếm các tệp trên máy tính của bạn, vì readFile trong Jenkins tìm trong hộp cát của java vm nơi công cụ đường ống của bạn có thể đang chạy ... Ngoài ra, bạn được phép sử dụng readfile trong hộp cát Đường ống nhưng sử dụng File () theo mặc định là không được phép, Tệp bạn sẽ phải đưa danh sách trắng vào cài đặt Jenkins trước khi bạn có thể sử dụng nó.
Cyborg-X1

2

Ở đây bạn có thể Tìm một số cách khác để làm tương tự.

Đọc tài liệu.

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

Đọc tập tin đầy đủ.

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

Đọc tập tin 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)

}

Tạo một tập tin mới.

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

Tôi không chắc chắn bạn cần defkhi bạn chỉ định loại.
Victor M Herasme Perez

Không sử dụng mã def sẽ hoạt động, tôi có thói quen xác định các biến đó!
shashi singh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.