Membaca Fail di Groovy

1. Gambaran keseluruhan

Dalam tutorial ringkas ini, kami akan meneroka pelbagai cara membaca fail di Groovy.

Groovy menyediakan cara mudah untuk mengendalikan fail. Kami akan menumpukan perhatian pada kelas Fail yang mempunyai beberapa kaedah pembantu untuk membaca fail.

Mari kita teliti satu persatu di bahagian berikut.

2. Membaca Baris Fail mengikut Baris

Terdapat banyak kaedah Groovy IO seperti readLine dan eachLine tersedia untuk membaca fail baris demi baris.

2.1. Menggunakan File.withReader

Mari kita mulakan dengan kaedah File .withReader . Ia membuat BufferedReader baru di bawah sampul yang boleh kita gunakan untuk membaca kandungan menggunakan kaedah readLine .

Sebagai contoh, mari kita baca baris demi baris fail dan mencetak setiap baris. Kami juga akan mengembalikan bilangan 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 fail fail teks biasaContent.txt dengan kandungan berikut dan gunakan untuk ujian:

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

Mari uji kaedah utiliti 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 kaedah juga boleh digunakan dengan parameter charset seperti UTF-8 atau ASCII untuk membaca fail yang dikodkan . Mari lihat contoh:

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

Kami juga boleh menggunakan kaedah masing - masing :

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

2.3. Menggunakan File.newInputStream dengan InputStream.eachLine

Mari lihat bagaimana kita dapat menggunakan InputStream dengan masing - masing Talian untuk membaca fail:

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

Apabila kita menggunakan kaedah InputStream yang baru , kita harus berurusan dengan menutup InputStream .

Sekiranya kita menggunakan kaedah withInputStream , ia akan mengatasi penutupan InputStream untuk kita:

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

3. Membaca Fail ke dalam Senarai

Kadang-kadang kita perlu membaca kandungan fail ke dalam senarai baris.

3.1. Menggunakan Fail.readLines

Untuk ini, kita boleh menggunakan kaedah readLines yang membaca fail ke dalam List of Strings .

Mari kita lihat sekilas contoh yang membaca kandungan fail dan mengembalikan senarai baris:

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

Mari tulis ujian pantas 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

Kita juga boleh membaca kandungan fail ke dalam Senarai daripada Strings menggunakan collect API:

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

3.3. Menggunakan sebagai Operator

Kita bahkan boleh memanfaatkan sebagai operator untuk membaca kandungan fail ke dalam rentetan String :

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

4. Membaca Fail menjadi Rentetan Tunggal

4.1. Menggunakan File.text

Kita boleh membaca fail keseluruhan ke dalam satu String hanya dengan menggunakan teks harta Fail kelas .

Mari kita lihat contohnya:

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

Mari sahkan ini dengan ujian 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

Sekiranya kita menggunakan kaedah getTest (charset) , kita dapat membaca kandungan fail yang dikodkan 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 fail HTML dengan kandungan UTF-8 bernama utf8Content.html untuk pengujian unit:

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

Mari lihat ujian unit:

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 Fail Binari dengan File.bytes

Groovy memudahkan membaca fail bukan teks atau binari. Dengan menggunakan harta bait , kita boleh mendapatkan kandungan Fail sebagai tatasusunan bait :

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

Kami akan menggunakan fail gambar png, sample.png , dengan kandungan berikut untuk pengujian unit:

Mari lihat ujian unit:

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. Kesimpulannya

Dalam tutorial ringkas ini, kami telah melihat pelbagai cara membaca fail di Groovy menggunakan pelbagai kaedah kelas Fail bersama dengan BufferedReader dan InputStream .

Kod sumber lengkap pelaksanaan ini dan kes ujian unit boleh didapati di projek GitHub.