1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Kotlin】Kotlin I/O(入出力)徹底解説

Posted at

概要

Kotlin の I/O(入出力)は、ファイルの読み書き・標準入力・標準出力などを扱うための API 群です。
Kotlin では Java の API(java.iojava.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

PathFiles の基本

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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?