テキストファイルからの読み込み
主に、File.readText()、BufferedReader.readLines()、BufferedReader.use、BufferedReader.useLinesを紹介します。
File.readText()でテキストファイルを読み込む。
File.readText()を使うと、テキストファイルの内容をStringとして取得できます。
以下は、文字コードがUTF8の場合とSJISの場合のサンプルです。
文字コードがUTF8のファイルを読み込むサンプル
val file = File(textFilePath)
readedText = file.readText()文字コードがSJISのファイルを読み込むサンプル
val file = File(textFilePath)
readedText = file.readText(Charset.forName("MS932"))BufferedReader.readLines()でテキストファイルの読み込む。
BufferedReader.readLines()を使うと、テキストファイルの内容をStream<String>として取得できます。
なお、BufferedReaderのclose()を呼び出す必要があるので、忘れないように注意してください。
文字コードがUTF8のファイルを読み込むサンプル
val file = File(textFilePath)
val bufferedReader = file.bufferedReader()
var lineNo = 1
bufferedReader.readLines().forEach {
println("$lineNo: $it")
lineNo++
}
bufferedReader.close()文字コードがSJISのファイルを読み込むサンプル
val file = File(textFilePath)
val bufferedReader = file.bufferedReader(Charset.forName("MS932"))
var lineNo = 1
bufferedReader.readLines().forEach {
println("$lineNo: $it")
lineNo++
}
bufferedReader.close()BufferedReader.useLinesでテキストファイルの読み込む。
BufferedReader.useLinesを使うと、テキストファイルの内容をStream<String>として取得できます。
Stream<String>として取得するとフィルタリングなどを容易に行えるため、便利です。
なお、BufferedReader.useLinesは自動的にファイルを閉じてくれるため、
BufferedReaderのclose()を呼び出す必要はありません。
文字コードがUTF8のファイルを読み込むサンプル
val file = File(textFilePath)
val bufferedReader = file.bufferedReader()
val result = bufferedReader.useLines {
var lineNo = 1
it.forEach {
readedItems.add(it)
println("$lineNo: $it")
lineNo++
}
// ラムダ式は、kotlin.Unit型を返すことになっているため、今回は成功の「true」を返す。
true
}
println("result : $result")文字コードがSJISのファイルを読み込むサンプル
val file = File(textFilePath)
val bufferedReader = file.bufferedReader(Charset.forName("MS932"))
val result = bufferedReader.useLines {
var lineNo = 1
it.forEach {
readedItems.add(it)
println("$lineNo: $it")
lineNo++
}
// ラムダ式は、kotlin.Unit型を返すことになっているため、今回は成功の「true」を返す。
true
}
println("result : $result")BufferedReader.useでテキストファイルを一行ずつ読み込む。
File.readText()、BufferedReader.readLines()、BufferedReader.useLinesでは、
テキストファイルを一度に読み込んでいるようです。よって、非常に大きなテキストファイルを
読み込む際にメモリが足りなくなる可能性があります。
そんな時は、BufferedReader.useを使い、BufferedReader.readLine()で一行ずつ読み込み、
必要な情報のみをメモリ上に残すようにしましょう。
なお、BufferedReader.useは自動的にファイルを閉じてくれるため、
BufferedReaderのclose()を呼び出す必要はありません。
文字コードがUTF8のファイルを読み込むサンプル
val file = File(textFilePath)
val bufferedReader = file.bufferedReader()
val result = bufferedReader.use {
var lineNo = 1
var lineText: String?
while (true) {
// 一行ずつ読み込む。
lineText = it.readLine()
if (lineText == null) {
break
}
readedItems.add(lineText)
println("$lineNo: $lineText")
lineNo++
}
// kotlin.Unit型を返すことになっているため、今回は成功の「true」を返す。
true
}
println("result : $result")文字コードがSJISとなっているテキストファイルを読み込む。
File.readText()やFile.bufferedReader()の引数にCharsetを指定することにより、
読み込むファイルの文字コードを指定できますが、ChsrsetsにSJISが登録されていません。
よって、以下のようにCharset.forName("MS932")と指定することにより、
SJISの文字コードのテキストファイルを読み込むことができるようになります。
File.readText()の場合
val text = File.readText(Charset.forName("MS932"))File.bufferedReader()の場合
val bufferedReader = File(testFilePath).bufferedReader(Charset.forName("MS932"))