Javaでファイルの読み込み、書き込みをする方法を調べていると、コーディングする人によって様々な書き方があることが分かりました。
そこで、それらをまとめて最も効率の良い書き方を考えましたので、ご紹介したいと思います。
目次
ファイル入出力
基本的には、Fileクラスを使用すれば読み書きが可能なのですが、効率を考えて以下のクラスを使いラッピングすることにしました。
ファイル読み込みクラス
ファイル書き込みクラス
ポイント
文字コードを指定できるようにStream系のクラスを使用します。
処理速度を向上させるために、Buffered系のクラスを使用しています。
また、ファイル書き込みクラスでは、FileWriter
でなく、出力文字列の整形などのテキスト出力に特化した機能があるPrintWriter
を採用しました。
Qiita
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9JUUzJTgzJTk1JUUzJTgyJUExJUUzJTgyJUE0JUUzJTgzJUFCJUU4JUFBJUFEJUUzJTgxJUJGJUU4JUJFJUJDJUUzJTgxJUJGJUUzJTgxJUFGJUU0JUJEJTk1JUUzJTgxJThDJUUzJTgzJTk5JUUzJTgyJUI5JUUzJTgzJTg4JUUzJTgxJUFBJUUzJTgxJUFFJUUzJTgxJThCJUVGJUJDJTg4SmF2YSVFRiVCQyU4OSZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZ0eHQtY29sb3I9JTIzMUUyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU2JnM9M2E4ZTU5OWMyOTE3NGMxMjcxOGE0ZTlmZmZhZmUwZTM&mark-x=142&mark-y=57&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDBtb3Rva2kxOTkwJnR4dC1jb2xvcj0lMjMxRTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9MzYmdHh0LWFsaWduPWxlZnQlMkN0b3Amcz0zODY5MDQxMzNkZDM4ZDI4NDBmZjJlYjA1NjQ2OTJhOQ&blend-x=142&blend-y=486&blend-mode=normal&s=6981b1ea617cd50b524d9c4a578a2485)
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9JUUzJTgzJTk1JUUzJTgyJUExJUUzJTgyJUE0JUUzJTgzJUFCJUU4JUFBJUFEJUUzJTgxJUJGJUU4JUJFJUJDJUUzJTgxJUJGJUUzJTgxJUFGJUU0JUJEJTk1JUUzJTgxJThDJUUzJTgzJTk5JUUzJTgyJUI5JUUzJTgzJTg4JUUzJTgxJUFBJUUzJTgxJUFFJUUzJTgxJThCJUVGJUJDJTg4SmF2YSVFRiVCQyU4OSZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZ0eHQtY29sb3I9JTIzMUUyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU2JnM9M2E4ZTU5OWMyOTE3NGMxMjcxOGE0ZTlmZmZhZmUwZTM&mark-x=142&mark-y=57&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDBtb3Rva2kxOTkwJnR4dC1jb2xvcj0lMjMxRTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9MzYmdHh0LWFsaWduPWxlZnQlMkN0b3Amcz0zODY5MDQxMzNkZDM4ZDI4NDBmZjJlYjA1NjQ2OTJhOQ&blend-x=142&blend-y=486&blend-mode=normal&s=6981b1ea617cd50b524d9c4a578a2485)
ファイル読み込みは何がベストなのか(Java) - Qiita
Javaのファイル読み込みにはたくさんの方法がありますが、どの方法が一番早いのか測定してみた。今回は全行読み込みにて測定してみました。#対象1.Files.readAllLinesJava7...
Javaサンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
public static void main(String[] args) { // ファイルパス String InputFile = args[0]; String OutputFile = args[1]; // 変数初期化 BufferedReader reader = null; PrintWriter writer = null; // 処理開始 try { // リーダ reader = new BufferedReader( new InputStreamReader( new FileInputStream(InputFile), "UTF-8")); // ライタ writer = new PrintWriter( new BufferedWriter( new OutputStreamWriter( new FileOutputStream(OutputFile), "UTF-8"))); // 読み書き開始 String str; while ((str = reader.readLine()) != null) { writer.write(str); writer.newLine(); } // 例外処理 } catch (IOException e) { e.printStackTrace(); // ファイルを閉じる } finaly { if (reader != null) reader.close(); if (writer != null) writer.close(); } } |
ポイント
ファイル入出力クラスについては上記の通りです。
ここでのポイントはファイルをクローズする方法です。
最初にファイル入出力用の変数を用意してから処理を開始し、
1 2 |
BufferedReader reader = null; PrintWriter writer = null; |
tryの中ではなくfinaly
でファイルを閉じます。
1 2 3 4 |
} finaly { if (reader != null) reader.close(); if (writer != null) writer.close(); } |
こうすることで、何かしらのエラーが発生して途中で処理が強制終了したとしても、必ずファイルを閉じることができます。以上、いかがでしょうか?
もっと良い方法がありましたら、コメントを頂けると嬉しいです!
コメント