val file = context.assets.open("myfile.json").bufferedReader().readText()
这是执行与上述行相同操作的代码。
val inputStream = context.assets.open("myfile.json")
val reader = inputStream.bufferedReader()
val file = reader.readText()
假设这里是
myfile.json
的内容。
{
"os": "Android",
"version": "KitKat",
"codeName": 4.4
}
让我们一步一步来
步骤1:第一行
val inputStream = context.assets.open("myfile.json")
这将返回一个
InputStream对象,它从json文件中读取一个字节或多个字节。如果在屏幕上以字节格式打印json文件内容,对于我们(作为程序员)来说阅读起来会非常困难。
第二行。
val reader = inputStream.bufferedReader()
这将创建一个
BufferedReader对象,它从json文件中读取一个字符或多个字符,但它们还有另一个有用的方法
readLine(), 这个方法读取一行文本。行被认为是由换行符('\n')、回车符('\r')或回车符后紧接着换行符之一终止的。
让我们修改当前的代码。
val inputStream = context.assets.open("myfile.json")
val reader = inputStream.bufferedReader()
var line = reader.readLine()
while(line != null) {
Log.i("TAG", line)
line = reader.readLine()
}
输出:
I/TAG: {
I/TAG: "os": "Android",
I/TAG: "version": "KitKat",
I/TAG: "codeName": 4.4
I/TAG: }
我们可以看到,他们从json文件中打印了5行。但在某些情况下,我们希望将整个json文件作为字符串打印出来,这就是我们进入下一步的原因。
第三行:
val file = reader.readText()
这将完全读取缓冲读取器作为字符串。您可以编写自己的代码来实现相同的功能。
val inputStream = context.assets.open("myfile.json")
val reader = inputStream.bufferedReader()
val sb = StringBuffer()
var line = reader.readLine()
while(line != null) {
Log.i("TAG", line)
sb.append(line).append("\n")
line = reader.readLine()
}
val file = sb.toString()
Log.i("TAG", file)
输出:
I/TAG: {
"os": "Android",
"version": "KitKat",
"codeName": 4.4
}
这个输出与
reader.readText()
相同。
结论:BufferReader将InputStream(或InputStream的子类)包装在其中,然后提供逐字符读取而不是逐字节读取InputStream的方法。此外,它们提供readLine()方法和缓冲数据。
InputStream(逐字节) -> Reader(逐字符)
InputStream(逐字节) -> BufferReader(逐字符,读行,缓冲数据)。