จะอ่านไฟล์ใน 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 () หรือไม่?
das Keks

6
@dasKeks ฉันคิดว่ามันปลอดภัยที่จะสมมติว่าการใช้วิธีนี้ปิดทรัพยากรที่จำเป็น อย่างไรก็ตามคุณไม่สามารถเข้าถึงผู้อ่านใด ๆ ที่อาจถูกสร้างขึ้นเพื่อให้คุณไม่สามารถใกล้มัน
Dónal

ฉันต้องการพูดถึงว่าการทำงานนี้แม้ว่าFileวัตถุที่มาจากขวดจาวาสามัญ ฉันไม่แน่ใจว่า 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 ที่ทันสมัย Linuxes แต่บางสิ่งบางอย่างเช่น Windows 1252 หรือ MacRoman บน Windows / Mac OS, ถ้าคุณไม่ได้แทนที่มันด้วย-Dfile.encoding=...)
เอียน Roberts

ใน Groovy เวอร์ชันล่าสุดอย่างน้อยการเดานั้นทำได้โดยใช้CharsetToolkitซึ่งทำการเดาที่ชาญฉลาด
Matthijs Bierman

53

ความแตกต่างเล็กน้อย ...

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

5
จริง แต่ก็ยังคงเป็นสำนวนที่มีประโยชน์ในการจับภาพ "สำหรับบันทึก"
Steve Byrne

มันเป็นสิ่งที่ดีที่จะเห็นสิ่งนี้ - ทำให้การประมวลผลไฟล์โดยบรรทัดเล็ก ๆ น้อย ๆ
Bill K


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 } นอกจากนี้หากไม่พบไฟล์แสดงว่ามีข้อผิดพลาด
Ashish

1
Btw เหตุผลนี้คือไฟล์ใหม่ () ค้นหาไฟล์ในคอมพิวเตอร์ของคุณเนื่องจาก readFile ใน Jenkins ดูใน sandbox แบบ Groovy ของ java vm ที่ไฟล์ไปป์ของคุณทำงานอยู่ ... นอกจากนี้คุณยังได้รับอนุญาตให้ใช้ readfile ใน sandbox ไปป์ไลน์ แต่การใช้ File () เป็นค่าเริ่มต้นไม่อนุญาตให้ใช้ไฟล์คุณจะต้องขึ้นบัญชีขาวในการตั้งค่า Jenkins ก่อนจึงจะสามารถใช้งานได้
Cyborg-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จะทำงานฉันมีนิสัยที่จะกำหนดตัวแปรเหล่านั้น!
shashi singh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.