如何在科特林中读取纯文本文件?
How to read plain text file in kotlin?
在 kotlin 中可能有多种读取纯文本文件的方法。
我想知道有哪些可能的方式以及如何使用它们。
1.使用 BufferedReader
import java.io.File
import java.io.BufferedReader
fun main(args: Array<String>) {
val bufferedReader: BufferedReader = File("example.txt").bufferedReader()
val inputString = bufferedReader.use { it.readText() }
println(inputString)
}
2。使用 InputStream
按行阅读
import java.io.File
import java.io.InputStream
fun main(args: Array<String>) {
val inputStream: InputStream = File("example.txt").inputStream()
val lineList = mutableListOf<String>()
inputStream.bufferedReader().forEachLine { lineList.add(it) }
lineList.forEach{println("> " + it)}
}
读取所有行
import java.io.File
import java.io.InputStream
fun main(args: Array<String>) {
val inputStream: InputStream = File("example.txt").inputStream()
val inputString = inputStream.bufferedReader().use { it.readText() }
println(inputString)
}
3。直接使用文件
import java.io.File
import java.io.BufferedReader
fun main(args: Array<String>) {
val lineList = mutableListOf<String>()
File("example.txt").useLines { lines -> lines.forEach { lineList.add(it) }}
lineList.forEach { println("> " + it) }
}
Anisuzzaman 的回答列出了几种可能性。
它们之间的主要区别在于文件是作为单个字符串读入内存,读入内存并拆分为行,还是逐行读取。
显然,一次将整个文件读入内存会占用更多内存,因此除非确实有必要,否则应避免这种情况。 (文本文件可以变得任意大!)因此使用 BufferedReader.useLines()
逐行处理通常是一个很好的方法。
其余差异主要是历史差异。 Java 的早期版本使用 InputStream
&c,它不能正确区分字符和字节;添加 Reader
&c 以更正该问题。 Java 增加了 8 种使用流更有效地逐行读取的方法(例如 Files.lines()
)。最近,Kotlin 添加了自己的扩展函数(例如 BufferedReader.useLines()
),这使它变得更加简单。
以上答案均基于 Kotlin Java。这是 Kotlin Native 读取文本文件的方式:
val bufferLength = 64 * 1024
val buffer = allocArray<ByteVar>(bufferLength)
for (i in 1..count) {
val nextLine = fgets(buffer, bufferLength, file)?.toKString()
if (nextLine == null || nextLine.isEmpty()) break
val records = parseLine(nextLine, ',')
val key = records[column]
val current = keyValue[key] ?: 0
keyValue[key] = current + 1
}
fun parseLine(line: String, separator: Char) : List<String> {
val result = mutableListOf<String>()
val builder = StringBuilder()
var quotes = 0
for (ch in line) {
when {
ch == '\"' -> {
quotes++
builder.append(ch)
}
(ch == '\n') || (ch == '\r') -> {}
(ch == separator) && (quotes % 2 == 0) -> {
result.add(builder.toString())
builder.setLength(0)
}
else -> builder.append(ch)
}
}
return result
}
要读取文本文件,必须先创建它。在 Android Studio 中,您可以像这样创建文本文件:
1)Select"Project"从上方的垂直工具栏打开项目"tool window"
2) 从顶部的下拉菜单中 "tool window", select "Android"
3) 右击 "App" 和 select "New"
然后 -> "Folder"(旁边有绿色 Android 图标的那个)
然后 -> "Assets Folder"
4) "assets" 文件夹出现在 "tool window" 后右击
5) Select "New" -> "File"
6) 命名文件,如果是文本文件则包含扩展名“.txt”,如果是WebView则包含扩展名“.html”
7) 编辑文件或将文本剪切并粘贴到其中。该文件现在将显示在 "tool window" 中的 "Project" 个文件下,您可以随时双击它进行编辑。
要访问此文件,请使用前缀 "application.assets.",后跟 someFunction(fileName)。例如(在 Kotlin 中):
val fileName = "townNames.txt"
val inputString = application.assets.open(fileName).bufferedReader().use { it.readText() }
val townList: List<String> = inputString.split("\n")
我认为最简单的编码方式是使用 kotlin.text 和 java.io.File
import java.io.File
fun main(args: Array<String>) {
val text = File("sample.txt").readText()
println(text)
}
在 kotlin 中可能有多种读取纯文本文件的方法。
我想知道有哪些可能的方式以及如何使用它们。
1.使用 BufferedReader
import java.io.File
import java.io.BufferedReader
fun main(args: Array<String>) {
val bufferedReader: BufferedReader = File("example.txt").bufferedReader()
val inputString = bufferedReader.use { it.readText() }
println(inputString)
}
2。使用 InputStream
按行阅读
import java.io.File
import java.io.InputStream
fun main(args: Array<String>) {
val inputStream: InputStream = File("example.txt").inputStream()
val lineList = mutableListOf<String>()
inputStream.bufferedReader().forEachLine { lineList.add(it) }
lineList.forEach{println("> " + it)}
}
读取所有行
import java.io.File
import java.io.InputStream
fun main(args: Array<String>) {
val inputStream: InputStream = File("example.txt").inputStream()
val inputString = inputStream.bufferedReader().use { it.readText() }
println(inputString)
}
3。直接使用文件
import java.io.File
import java.io.BufferedReader
fun main(args: Array<String>) {
val lineList = mutableListOf<String>()
File("example.txt").useLines { lines -> lines.forEach { lineList.add(it) }}
lineList.forEach { println("> " + it) }
}
Anisuzzaman 的回答列出了几种可能性。
它们之间的主要区别在于文件是作为单个字符串读入内存,读入内存并拆分为行,还是逐行读取。
显然,一次将整个文件读入内存会占用更多内存,因此除非确实有必要,否则应避免这种情况。 (文本文件可以变得任意大!)因此使用 BufferedReader.useLines()
逐行处理通常是一个很好的方法。
其余差异主要是历史差异。 Java 的早期版本使用 InputStream
&c,它不能正确区分字符和字节;添加 Reader
&c 以更正该问题。 Java 增加了 8 种使用流更有效地逐行读取的方法(例如 Files.lines()
)。最近,Kotlin 添加了自己的扩展函数(例如 BufferedReader.useLines()
),这使它变得更加简单。
以上答案均基于 Kotlin Java。这是 Kotlin Native 读取文本文件的方式:
val bufferLength = 64 * 1024
val buffer = allocArray<ByteVar>(bufferLength)
for (i in 1..count) {
val nextLine = fgets(buffer, bufferLength, file)?.toKString()
if (nextLine == null || nextLine.isEmpty()) break
val records = parseLine(nextLine, ',')
val key = records[column]
val current = keyValue[key] ?: 0
keyValue[key] = current + 1
}
fun parseLine(line: String, separator: Char) : List<String> {
val result = mutableListOf<String>()
val builder = StringBuilder()
var quotes = 0
for (ch in line) {
when {
ch == '\"' -> {
quotes++
builder.append(ch)
}
(ch == '\n') || (ch == '\r') -> {}
(ch == separator) && (quotes % 2 == 0) -> {
result.add(builder.toString())
builder.setLength(0)
}
else -> builder.append(ch)
}
}
return result
}
要读取文本文件,必须先创建它。在 Android Studio 中,您可以像这样创建文本文件:
1)Select"Project"从上方的垂直工具栏打开项目"tool window" 2) 从顶部的下拉菜单中 "tool window", select "Android" 3) 右击 "App" 和 select "New" 然后 -> "Folder"(旁边有绿色 Android 图标的那个) 然后 -> "Assets Folder" 4) "assets" 文件夹出现在 "tool window" 后右击 5) Select "New" -> "File" 6) 命名文件,如果是文本文件则包含扩展名“.txt”,如果是WebView则包含扩展名“.html” 7) 编辑文件或将文本剪切并粘贴到其中。该文件现在将显示在 "tool window" 中的 "Project" 个文件下,您可以随时双击它进行编辑。
要访问此文件,请使用前缀 "application.assets.",后跟 someFunction(fileName)。例如(在 Kotlin 中):
val fileName = "townNames.txt"
val inputString = application.assets.open(fileName).bufferedReader().use { it.readText() }
val townList: List<String> = inputString.split("\n")
我认为最简单的编码方式是使用 kotlin.text 和 java.io.File
import java.io.File
fun main(args: Array<String>) {
val text = File("sample.txt").readText()
println(text)
}