1. Overview
1.概述
In this quick tutorial, we’ll explore different ways of reading a file in Groovy.
在这个快速教程中,我们将探讨在Groovy中读取文件的不同方法。
Groovy provides convenient ways to handle files. We’ll concentrate on the File class which has some helper methods for reading files.
Groovy提供了方便的方法来处理文件。我们将集中讨论File类,它有一些读取文件的辅助方法。
Let’s explore them one by one in the following sections.
让我们在下面的章节中逐一探讨它们。
2. Reading a File Line by Line
2.逐行阅读文件
There are many Groovy IO methods like readLine and eachLine available for reading files line by line.
有许多Groovy IO方法,如readLine和eachLine可用于逐行读取文件。
2.1. Using File.withReader
2.1.使用File.withReader
Let’s start with the File.withReader method. It creates a new BufferedReader under the covers that we can use to read the contents using the readLine method.
让我们从File.withReader方法开始。它在封面下创建了一个新的BufferedReader,我们可以使用readLine方法来读取内容。
For example, let’s read a file line by line and print each line. We’ll also return the number of lines:
例如,让我们逐行读取一个文件并打印每一行。我们还将返回行数。
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
}
Let’s create a plain text file fileContent.txt with the following contents and use it for the testing:
让我们创建一个纯文本文件fileContent.txt,内容如下,并使用它进行测试。
Line 1 : Hello World!!!
Line 2 : This is a file content.
Line 3 : String content
Let’s test out our utility method:
让我们测试一下我们的实用方法。
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 method can also be used with a charset parameter like UTF-8 or ASCII to read encoded files. Let’s see an example:
withReader方法也可以与UTF-8或ASCII等字符集参数一起使用,以读取编码文件。让我们看一个例子。
new File("src/main/resources/utf8Content.html").withReader('UTF-8') { reader ->
def line
while ((line = reader.readLine()) != null) {
println "${line}"
}
}
2.2. Using File.eachLine
2.2.使用File.eachLine
We can also use the eachLine method:
我们也可以使用eachLine方法。
new File("src/main/resources/fileContent.txt").eachLine { line ->
println line
}
2.3. Using File.newInputStream with InputStream.eachLine
2.3.使用File.newInputStream与InputStream.eachLine
Let’s see how we can use the InputStream with eachLine to read a file:
让我们看看如何使用InputStream与eachLine来读取一个文件。
def is = new File("src/main/resources/fileContent.txt").newInputStream()
is.eachLine {
println it
}
is.close()
When we use the newInputStream method, we have to deal with closing the InputStream.
当我们使用newInputStream方法时,我们必须处理关闭InputStream。
If we use the withInputStream method instead, it will handle closing the InputStream for us:
如果我们使用withInputStream方法,它将为我们处理关闭InputStream。
new File("src/main/resources/fileContent.txt").withInputStream { stream ->
stream.eachLine { line ->
println line
}
}
3. Reading a File into a List
3.将一个文件读入一个列表
Sometimes we need to read the content of a file into a list of lines.
有时我们需要将一个文件的内容读成一个行的列表。
3.1. Using File.readLines
3.1.使用File.readLines
For this, we can use the readLines method which reads the file into a List of Strings.
为此,我们可以使用readLines方法,将文件读成List的Strings。
Let’s have a quick look at an example that reads file content and returns a list of lines:
让我们快速看一下一个读取文件内容并返回行数列表的例子。
List<String> readFileInList(String filePath) {
File file = new File(filePath)
def lines = file.readLines()
return lines
}
Let’s write a quick test using fileContent.txt:
让我们用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<String>
assert lines.size(), 3
}
3.2. Using File.collect
3.2.使用文件.收集
We can also read the file content into a List of Strings using the collect API:
我们还可以使用collect API将文件内容读成List of Strings。
def list = new File("src/main/resources/fileContent.txt").collect {it}
3.3. Using the as Operator
3.3.使用 as操作符
We can even leverage the as operator to read the contents of the file into a String array:
我们甚至可以利用as操作符将文件的内容读入String数组。
def array = new File("src/main/resources/fileContent.txt") as String[]
4. Reading a File into a Single String
4.将一个文件读成一个字符串
4.1. Using File.text
4.1.使用File.text
We can read an entire file into a single String simply by using the text property of the File class.
我们可以通过使用File类的text属性,将整个文件读成一个String。
Let’s have a look at an example:
让我们来看看一个例子。
String readFileString(String filePath) {
File file = new File(filePath)
String fileContent = file.text
return fileContent
}
Let’s verify this with a unit test:
让我们用一个单元测试来验证这一点。
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. Using File.getText
4.2.使用File.getText
If we use the getTest(charset) method, we can read the content of an encoded file into a String by providing a charset parameter like UTF-8 or ASCII:
如果我们使用getTest(charset)方法,我们可以通过提供UTF-8或ASCII等字符集参数,将编码文件的内容读入String。
String readFileStringWithCharset(String filePath) {
File file = new File(filePath)
String utf8Content = file.getText("UTF-8")
return utf8Content
}
Let’s create an HTML file with UTF-8 content named utf8Content.html for the unit testing:
让我们创建一个UTF-8内容的HTML文件,命名为utf8Content.html,用于单元测试。
ᚠᛇᚻ᛫ᛒᛦᚦ᛫ᚠᚱᚩᚠᚢᚱ᛫ᚠᛁᚱᚪ᛫ᚷᛖᚻᚹᛦᛚᚳᚢᛗ
ᛋᚳᛖᚪᛚ᛫ᚦᛖᚪᚻ᛫ᛗᚪᚾᚾᚪ᛫ᚷᛖᚻᚹᛦᛚᚳ᛫ᛗᛁᚳᛚᚢᚾ᛫ᚻᛦᛏ᛫ᛞᚫᛚᚪᚾ
ᚷᛁᚠ᛫ᚻᛖ᛫ᚹᛁᛚᛖ᛫ᚠᚩᚱ᛫ᛞᚱᛁᚻᛏᚾᛖ᛫ᛞᚩᛗᛖᛋ᛫ᚻᛚᛇᛏᚪᚾ
Let’s see the unit test:
让我们看看单元测试。
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. Reading a Binary File with File.bytes
5.用File.bytes读取二进制文件
Groovy makes it easy to read non-text or binary files. By using the bytes property, we can get the contents of the File as a byte array:
Groovy使读取非文本或二进制文件变得容易。通过使用bytes属性,我们可以将File的内容作为一个byte数组来获得。
byte[] readBinaryFile(String filePath) {
File file = new File(filePath)
byte[] binaryContent = file.bytes
return binaryContent
}
We’ll use a png image file, sample.png, with the following contents for the unit testing:
我们将使用一个png图像文件,sample.png,其内容如下,用于单元测试。
Let’s see the unit test:
让我们看看单元测试。
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. Conclusion
6.结语
In this quick tutorial, we’ve seen different ways of reading a file in Groovy using various methods of the File class along with the BufferedReader and InputStream.
在这个快速教程中,我们看到了在Groovy中使用File类的各种方法以及BufferedReader和InputStream读取文件的不同方式。
The complete source code of these implementations and unit test cases can be found in the GitHub project.
这些实现的完整源代码和单元测试案例可以在GitHub>项目中找到。