1. 概要

このクイックチュートリアルでは、Kotlinでファイルを読み取るさまざまな方法について学習します。

ファイル全体をString、として読み取る場合と、個々の行のリストに読み込む場合の両方のユースケースについて説明します。 また、完全な絶対パスまたはプロジェクトリソースから取得します。

2. ファイルの読み取り

まず、Kotlinによって読み取られる入力ファイルを作成しましょう。 Kotlin。というファイルを作成し、コードからアクセスできるディレクトリに配置します。

ファイルの内容は次のとおりです。

Hello to Kotlin. It's:
1. Concise
2. Safe
3. Interoperable
4. Tool-friendly

次に、このファイルを読み取るさまざまな方法を見てみましょう。 上記で作成したファイルのフルパスを初期メソッドの入力として渡し、最後の2つのリソースの相対パスを渡す必要があります。

2.1. forEachLine

指定されたcharset(デフォルトはUTF-8)を使用して、ファイルを1行ずつ読み取り、各行に対してアクションを呼び出します。

fun readFileLineByLineUsingForEachLine(fileName: String) 
  = File(fileName).forEachLine { println(it) }

2.2. useLines

指定されたブロックコールバックを呼び出し、ファイル内のすべての行のシーケンスを提供します。

処理が完了すると、ファイルは閉じられます。

fun readFileAsLinesUsingUseLines(fileName: String): List<String>
  = File(fileName).useLines { it.toList() }

2.3. bufferedReader

ファイルの内容を読み取るための新しいBufferedReaderを返します。

BufferedReader を取得すると、その中のすべての行を読み取ることができます。

fun readFileAsLinesUsingBufferedReader(fileName: String): List<String>
  = File(fileName).bufferedReader().readLines()

2.4. readLines

ファイルの内容を行のリストとして直接読み取ります。

fun readFileAsLinesUsingReadLines(fileName: String): List<String> 
  = File(fileName).readLines()

この方法は、巨大なファイルに使用することはお勧めしません。

2.5. inputStream

ファイルの新しいFileInputStreamを作成し、結果として返します。

入力ストリームを取得したら、それをバイトに変換してから、完全なStringに変換できます。

fun readFileAsTextUsingInputStream(fileName: String)
  = File(fileName).inputStream().readBytes().toString(Charsets.UTF_8)

2.6. readText

ファイルのコンテンツ全体を文字列として読み取ります指定された文字セット(デフォルトはUTF-8):

fun readFileDirectlyAsText(fileName: String): String 
  = File(fileName).readText(Charsets.UTF_8)

この方法は巨大なファイルには推奨されておらず、2GBのファイルサイズの内部制限があります。

2.7. getResource

指定された名前のリソースを検索し、URLオブジェクトを返します。

fun readFileUsingGetResource(fileName: String) 
  = this::class.java.getResource(fileName).readText(Charsets.UTF_8)

リソースが見つかると、 URL が返されます。これは、前に示したようにreadTextメソッドを呼び出すことで処理できます。 リソースが見つからない場合は、nullを返します。 getResource を使用する場合、渡される fileName は絶対ファイル名ではなく、プロジェクトリソースに関連する名前です。

2.8. getResourceAsStream

指定された名前のリソースを検索し、InputStreamインスタンスを返します。

fun readFileAsLinesUsingGetResourceAsStream(fileName: String) 
  = this::class.java.getResourceAsStream(fileName).bufferedReader().readLines()

リソースが見つかると、 InputStream が返されます。これは、前に示したように処理できます。たとえば、BufferedReaderを取得します。 リソースが見つからない場合は、nullを返します。 getResourceAsStream を使用する場合、渡される fileName は絶対ファイル名ではなく、プロジェクトリソースに関連する名前です。

3. 結論

この記事では、Kotlinでファイルを読み取るさまざまな方法を見てきました。 ユースケースに応じて、ファイルを1行ずつ読み取るか、完全にテキストとして読み取るかを選択できます。 ファイルを絶対的に参照することも、リソースの中から見つけることもできます。

この記事のソースコードは、次のGitHubリポジトリにあります。