単純なテキスト ファイルを文字列に読み込もうとしています。もちろん、入力ストリームを取得して readLine() で反復処理し、内容を文字列に読み込むという通常の方法もあります。
過去に何百回もこれをやったことがあるのですが、どうすれば最小限のコード行数でこれを実行できるのか疑問に思いました。Java には、String fileContents = XXX.readFile(myFile/*File*/)
これと同じくらいシンプルに見えるもののようなものはないでしょうか?
Apache Commons IO のようなライブラリがそのような簡略化を提供していることは知っていますし、これを行うための簡単な Util クラスを書くこともできます。しかし、私が疑問に思うのは、これは誰もが必要とする非常に頻繁な操作なのに、なぜ Java はこのような簡単な機能を提供しないのかということです。ファイルをデフォルトまたは指定されたエンコードで文字列に読み込む単一のメソッドは実際にはどこかに存在しないのでしょうか。
ベストアンサー1
はい、これを 1 行で実行できます (ただし、堅牢なIOException
処理のためにはそうしたくないでしょう)。
String content = new Scanner(new File("filename")).useDelimiter("\\Z").next();
System.out.println(content);
これは、java.util.Scanner
は、入力を (\Z
文字列アンカーの末尾)で区切るように指示します。これにより、最終的に入力には 1 つの実際のトークン(ファイル全体)が含まれるようになり、 を 1 回呼び出すだけで読み取ることができますnext()
。
があるコンストラクタは、File
および を受け取りますString charSetName
(他の多くのオーバーロードの中でも)。これら 2 つのコンストラクタは をスローする可能性がありますFileNotFoundException
が、すべてのScanner
メソッドと同様に、IOException
これらのコンストラクタを超えて をスローすることはできません。
自体を照会するScanner
には、ioException()
メソッドでIOException
発生したかどうかを確認します。明示的にclose()
Scanner
コンテンツを読み取った後、参照をローカル変数に保存するのが最適かもしれませんScanner
。
参照
関連する質問
- java.util.Scanner を使用した入力の検証- より典型的な使用例が多数あります
サードパーティライブラリオプション
完全を期すために、非常に評判が良く、非常に便利なサードパーティ ライブラリをお持ちの場合は、次のオプションが本当に役立ちます。
グアバ
com.google.common.io.Files
多くの便利なメソッドが含まれています。ここで関連するものは次のとおりです。
String toString(File, Charset)
- 指定された文字セットを使用して、ファイルからすべての文字を読み込み、
String
- 指定された文字セットを使用して、ファイルからすべての文字を読み込み、
List<String> readLines(File, Charset)
- ... ファイルからすべての行を に読み込み
List<String>
、1 行につき 1 つのエントリを作成します。
- ... ファイルからすべての行を に読み込み
アパッチ コモンズ/IO
org.apache.commons.io.IOUtils
同様の機能も提供します:
String toString(InputStream, String encoding)
- 指定された文字エンコーディングを使用して、の内容
InputStream
をString
- 指定された文字エンコーディングを使用して、の内容
List readLines(InputStream, String encoding)
List
...の(生の)としてString
、1行に1つのエントリ