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
}
让我们一步一步来
第一步:第一行
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()
// Read line by line from reader until reach the end.
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 (逐字符,
读取行,缓冲数据)。