BufferedReader和BufferedStream
时间: 2024-09-12 19:00:20 浏览: 51
BufferedReader是Java中一个字符输入流的缓冲包装器类,它继承自Reader类。它用于读取文本数据,将读取的数据存储在一个字符缓冲区中,当缓冲区满了之后才从底层的Reader读取更多数据。这样可以减少实际的物理输入操作,从而提高读取文本数据的效率。使用BufferedReader时,通常配合readLine()方法使用,可以逐行读取文本文件中的内容。
BufferedStream并不是Java标准库中的一个类,这可能是一个误解或者是一个用户自定义的类。在Java的标准I/O库中,与BufferedReader类似的字节流缓冲包装器是BufferedInputStream和BufferedOutputStream,它们分别是InputStream和OutputStream的子类。这两个类用于包装字节流,提高读写数据的效率。
通常使用BufferedReader和BufferedInputStream时,可以与其他的流类结合使用,例如FileReader或FileInputStream,来读取文件内容。这种方式在处理大量数据时特别有用,因为它可以减少对磁盘的访问次数,从而提高程序的性能。
相关问题
fun Context.readTxtFileByLinesWithProgress(uri: Uri): Sequence<Pair<String, Float>> { val inputStream = this.contentResolver.openInputStream(uri)!! val totalBytes = inputStream.available().toFloat() val bufferedStream = BufferedInputStream(inputStream) val reader = InputStreamReader(bufferedStream, Charsets.UTF_8) val bufferedReader = BufferedReader(reader) return sequence { var readBytes = 0f bufferedReader.useLines { lines -> lines.forEach { line -> readBytes += line.toByteArray(Charsets.UTF_8).size.toFloat() val progress = readBytes / totalBytes * 100 yield(line to progress) } } bufferedStream.close() reader.close() bufferedReader.close() } } 实现倒叙
可以通过将 `yield(line to progress)` 改为 `yield(line to totalBytes - readBytes)` 实现倒序。
下面是修改后的代码:
```kotlin
fun Context.readTxtFileByLinesWithProgress(uri: Uri): Sequence<Pair<String, Float>> {
val inputStream = this.contentResolver.openInputStream(uri)!!
val totalBytes = inputStream.available().toFloat()
val bufferedStream = BufferedInputStream(inputStream)
val reader = InputStreamReader(bufferedStream, Charsets.UTF_8)
val bufferedReader = BufferedReader(reader)
return sequence {
var readBytes = 0f
val lines = bufferedReader.useLines { it.toList().asReversed() }
lines.forEach { line ->
readBytes += line.toByteArray(Charsets.UTF_8).size.toFloat()
val progress = totalBytes - readBytes
yield(line to progress)
}
bufferedStream.close()
reader.close()
bufferedReader.close()
}
}
```
注意,这里使用了 `useLines` 函数中的 `toList()` 将所有行读入内存并反转,因此在处理大文件时可能会有性能问题。如果需要处理大文件,可以考虑逐行倒序读取并处理。
阅读全文