Membaca File di Groovy

1. Ikhtisar

Dalam tutorial singkat ini, kita akan menjelajahi berbagai cara membaca file di Groovy.

Groovy menyediakan cara mudah untuk menangani file. Kami akan berkonsentrasi pada kelas File yang memiliki beberapa metode pembantu untuk membaca file.

Mari kita jelajahi satu per satu di bagian berikut.

2. Membaca File Baris demi Baris

Ada banyak metode Groovy IO seperti readLine dan eachLine tersedia untuk membaca file baris demi baris.

2.1. Menggunakan File.withReader

Mari kita mulai dengan metode File .withReader . Ini membuat BufferedReader baru di bawah sampul yang bisa kita gunakan untuk membaca konten menggunakan metode readLine .

Sebagai contoh, mari kita membaca file baris demi baris dan mencetak setiap baris. Kami juga akan mengembalikan jumlah baris:

int readFileLineByLine(String filePath) { File file = new File(filePath) def line, noOfLines = 0; file.withReader { reader -> while ((line = reader.readLine()) != null) { println "${line}" noOfLines++ } } return noOfLines }

Mari buat file teks biasa fileContent.txt dengan konten berikut dan gunakan untuk pengujian:

Line 1 : Hello World!!! Line 2 : This is a file content. Line 3 : String content

Mari kita uji metode utilitas kami:

def 'Should return number of lines in File given filePath' () { given: def filePath = "src/main/resources/fileContent.txt" when: def noOfLines = readFile.readFileLineByLine(filePath) then: noOfLines noOfLines instanceof Integer assert noOfLines, 3 } 

The withReader Metode ini juga dapat digunakan dengan parameter charset seperti UTF-8 atau ASCII untuk membaca file dikodekan . Mari kita lihat contohnya:

new File("src/main/resources/utf8Content.html").withReader('UTF-8') { reader -> def line while ((line = reader.readLine()) != null) { println "${line}" } }

2.2. Menggunakan File.eachLine

Kita juga bisa menggunakan metode eachLine :

new File("src/main/resources/fileContent.txt").eachLine { line -> println line } 

2.3. Menggunakan File.newInputStream dengan InputStream.eachLine

Mari kita lihat bagaimana kita dapat menggunakan InputStream dengan eachLine untuk membaca file:

def is = new File("src/main/resources/fileContent.txt").newInputStream() is.eachLine { println it } is.close()

Saat kita menggunakan metode newInputStream , kita harus berurusan dengan penutupan InputStream .

Jika kita menggunakan metode withInputStream , ini akan menangani penutupan InputStream untuk kita:

new File("src/main/resources/fileContent.txt").withInputStream { stream -> stream.eachLine { line -> println line } }

3. Membaca File menjadi Daftar

Terkadang kita perlu membaca konten file ke dalam daftar baris.

3.1. Menggunakan File.readLines

Untuk ini, kita dapat menggunakan metode readLines yang membaca file menjadi List of Strings .

Mari kita lihat sekilas contoh yang membaca konten file dan mengembalikan daftar baris:

List readFileInList(String filePath) { File file = new File(filePath) def lines = file.readLines() return lines }

Mari tulis pengujian cepat menggunakan fileContent.txt :

def 'Should return File Content in list of lines given filePath' () { given: def filePath = "src/main/resources/fileContent.txt" when: def lines = readFile.readFileInList(filePath) then: lines lines instanceof List assert lines.size(), 3 }

3.2. Menggunakan File.collect

Kami juga dapat membaca isi file ke dalam Daftar dari Strings menggunakan mengumpulkan API:

def list = new File("src/main/resources/fileContent.txt").collect {it} 

3.3. Menggunakan sebagai Operator

Kami bahkan dapat memanfaatkan operator as untuk membaca konten file ke dalam array String :

def array = new File("src/main/resources/fileContent.txt") as String[]

4. Membaca File menjadi String Tunggal

4.1. Menggunakan File.text

Kita dapat membaca seluruh file menjadi satu String hanya dengan menggunakan properti teks dari kelas File .

Mari kita lihat contohnya:

String readFileString(String filePath) { File file = new File(filePath) String fileContent = file.text return fileContent } 

Mari kita verifikasi ini dengan uji unit:

def 'Should return file content in string given filePath' () { given: def filePath = "src/main/resources/fileContent.txt" when: def fileContent = readFile.readFileString(filePath) then: fileContent fileContent instanceof String fileContent.contains("""Line 1 : Hello World!!! Line 2 : This is a file content. Line 3 : String content""") }

4.2. Menggunakan File.getText

Jika kita menggunakan metode getTest (charset) , kita dapat membaca konten file yang dienkode ke dalam String dengan memberikan parameter charset seperti UTF-8 atau ASCII:

String readFileStringWithCharset(String filePath) { File file = new File(filePath) String utf8Content = file.getText("UTF-8") return utf8Content }

Mari buat file HTML dengan konten UTF-8 bernama utf8Content.html untuk pengujian unit:

ᚠᛇᚻ᛫ᛒᛦᚦ᛫ᚠᚱᚩᚠᚢᚱ᛫ᚠᛁᚱᚪ᛫ᚷᛖᚻᚹᛦᛚᚳᚢᛗ ᛋᚳᛖᚪᛚ᛫ᚦᛖᚪᚻ᛫ᛗᚪᚾᚾᚪ᛫ᚷᛖᚻᚹᛦᛚᚳ᛫ᛗᛁᚳᛚᚢᚾ᛫ᚻᛦᛏ᛫ᛞᚫᛚᚪᚾ ᚷᛁᚠ᛫ᚻᛖ᛫ᚹᛁᛚᛖ᛫ᚠᚩᚱ᛫ᛞᚱᛁᚻᛏᚾᛖ᛫ᛞᚩᛗᛖᛋ᛫ᚻᛚᛇᛏᚪᚾ 

Mari kita lihat unit testnya:

def 'Should return UTF-8 encoded file content in string given filePath' () { given: def filePath = "src/main/resources/utf8Content.html" when: def encodedContent = readFile.readFileStringWithCharset(filePath) then: encodedContent encodedContent instanceof String }

5. Membaca File Biner dengan File.bytes

Groovy memudahkan membaca file non-teks atau biner. Dengan menggunakan properti byte , kita bisa mendapatkan konten File sebagai array byte :

byte[] readBinaryFile(String filePath) { File file = new File(filePath) byte[] binaryContent = file.bytes return binaryContent }

Kami akan menggunakan file gambar png, sample.png , dengan konten berikut untuk pengujian unit:

Mari kita lihat unit testnya:

def 'Should return binary file content in byte array given filePath' () { given: def filePath = "src/main/resources/sample.png" when: def binaryContent = readFile.readBinaryFile(filePath) then: binaryContent binaryContent instanceof byte[] binaryContent.length == 329 }

6. Kesimpulan

Dalam tutorial singkat ini, kita telah melihat berbagai cara membaca file di Groovy menggunakan berbagai metode kelas File bersama dengan BufferedReader dan InputStream .

Kode sumber lengkap dari implementasi ini dan kasus uji unit dapat ditemukan di proyek GitHub.