概要
Kotlin の I/O(入出力)は、ファイルの読み書き・標準入力・標準出力などを扱うための API 群です。
Kotlin では Java の API(java.io や java.nio.file)をそのまま利用できますが、より簡潔で安全な書き方を提供する拡張関数も用意されています。
Kotlin I/O の種類
| 種類 | 主な API | 概要 |
|---|---|---|
| 標準 I/O |
readLine(), print(), println()
|
コンソールからの入力や出力 |
| ファイル I/O(簡易) |
File("path").readText() / .writeText()
|
シンプルなファイル読み書き |
| ファイル I/O(NIO) |
Path, Files
|
Java NIO ベースのモダン I/O |
| Kotlin Path 拡張 | kotlin.io.path.* |
Path に対する便利な Kotlin 拡張 |
1. 標準入出力
標準入力(readLine)
fun main() {
print("名前を入力してください: ")
val name = readLine()
println("こんにちは、$name さん!")
}
readLine() は標準入力から1行読み込み、String?(nullable)を返します。
(EOFなどでnullが返る可能性があるため、!!や?:で処理)
2. java.io.File ベースの I/O
Kotlin では Java の File クラスを直接使えますが、拡張関数により非常に簡潔に書けます。
import java.io.File
fun main() {
val file = File("data.txt")
// 書き込み
file.writeText("Hello, Kotlin I/O!")
// 追記
file.appendText("\nAppended line.")
// 読み込み
val text = file.readText()
println(text)
// 行単位
val lines = file.readLines()
println(lines)
}
File は古くからあるAPIで、非同期I/Oやパスの抽象化が弱い点があります。
→ 近年は NIO(java.nio.file) の利用が推奨されます。
3. NIO (java.nio.file) ベースのモダン I/O
Path と Files の基本
import java.nio.file.*
fun main() {
val path = Paths.get("data.txt")
// 書き込み
Files.writeString(path, "Modern NIO I/O!")
// 読み込み
val text = Files.readString(path)
println(text)
// 存在チェック
if (Files.exists(path)) {
println("ファイルが存在します")
}
// ファイル一覧
val dir = Paths.get(".")
Files.list(dir).forEach { println(it) }
}
NIOの特徴
-
Pathによるパス表現(OSに依存しない) -
Filesによる静的メソッド群 - 高速・ノンブロッキング対応(
AsynchronousFileChannelなど)
4. kotlin.io.path – Kotlin 拡張でより直感的に
Kotlin 1.4 以降では、kotlin.io.path パッケージが導入され、
Path 向けの Kotlin らしい API が提供されています。
import kotlin.io.path.*
fun main() {
val path = Path("kotlin.txt")
// 書き込み
path.writeText("Hello, kotlin.io.path!")
// 読み込み
val content = path.readText()
println(content)
// 存在確認
if (path.exists()) {
println("存在します")
}
// 削除
path.deleteIfExists()
// 親ディレクトリ作成
val dir = Path("data/logs")
dir.createDirectories()
}
kotlin.io.path による主な拡張関数:
| 関数 | 説明 |
|---|---|
Path.exists() |
存在チェック |
Path.deleteIfExists() |
存在すれば削除 |
Path.createDirectories() |
親ディレクトリを含め作成 |
Path.readText() / writeText()
|
テキストファイル操作 |
Path.readBytes() / writeBytes()
|
バイナリ操作 |
Path.copyTo() / moveTo()
|
コピー・移動 |
Path.listDirectoryEntries() |
ファイル一覧取得 |
5. 行単位の読み書きと加工
import kotlin.io.path.*
fun main() {
val path = Path("numbers.txt")
// 複数行書き込み
path.writeLines(listOf("1", "2", "3", "4", "5"))
// 読み込み + 加工
val sum = path.readLines().map { it.toInt() }.sum()
println("合計: $sum")
}
readLines() はメモリ上に全行を展開するため、
巨大ファイルには useLines { ... } を使うのが安全です。
path.useLines { lines ->
lines.filter { it.isNotEmpty() }
.forEach { println(it) }
}
6. 実用例:ログファイルを操作するユーティリティ
import kotlin.io.path.*
object LogUtil {
private val logDir = Path("logs").apply { createDirectories() }
fun writeLog(message: String) {
val logFile = logDir.resolve("app.log")
logFile.appendText("[${java.time.LocalDateTime.now()}] $message\n")
}
}
fun main() {
LogUtil.writeLog("アプリ起動")
LogUtil.writeLog("処理完了")
}
まとめ
| 要素 | 推奨API | 特徴 |
|---|---|---|
| 標準入力/出力 |
readLine(), print()
|
シンプル |
| ファイル入出力(簡易) |
java.io.File + 拡張関数 |
小規模向け |
| モダン入出力 | java.nio.file.* |
高速・安全 |
| Kotlin 拡張 | kotlin.io.path.* |
Kotlin らしい直感的API |