ファイルを取り扱っているとファイルを読み込む際 InputStream ではなくバイト配列(byte[])で取得したい、ということがあると思います。
以前の投稿「[POI] 対処編:テンプレートファイルが書き変わるようになってしまった」では、FileInputStream からバイト配列を求めていました。
[POI] 対処編:テンプレートファイルが書き変わるようになってしまった
Apache POI 3.13 を使用してエクセルファイルを作成する際、テンプレートファイルを開いて編集しようとすると、編集内容が随時、テンプレートファイルに書き込まれてしまう事象に出会いました。 その事象について、前回の投稿「 テンプレー...
しかしそれは、コードだけ見ると Java の初心者にはとても伝わりにくいものだと思います。
そこで Java 初心者にも伝わる簡単な書き方を記載します。
用意するのもは Apache Commons の Commons IO だけです。
※ セットアップ方法については割愛します。
「語らなくていいから とにかくコードを見せろよ」と言われている気がする(笑)ので、以前の投稿に記した Commons IO を使わない書き方と、Commons IO を使った書き方を並べておきます。
まずは修正前のコードから。
/** * ファイルのコピーを生成. * @param file 対象ファイル * @return ファイルのコピー * @throws IOException 入出力時の例外 */ private static InputStream copy(final File file) throws IOException { try (final InputStream fio = new FileInputStream(file)) { final byte[] data = new byte[(int) file.length()]; fio.read(data); return new ByteArrayInputStream(data); } }
このコードを簡単に書くにはorg.apache.commons.io.FileUtils.readFileToByteArray
メソッドを使います。
修正後のコードはこちら。
/** * ファイルのコピーを生成. * @param file 対象ファイル * @return ファイルのコピー * @throws IOException 入出力時の例外 */ private static InputStream copy(final File file) throws IOException { return new ByteArrayInputStream(FileUtils.readFileToByteArray(file)); }
5 行だったのが 1 行で書け、必要なテストケースも減りました。
何よりメソッド名を読めば何をしているか理解できるというところが重要です。
仕事でプログラムを書く際は、読み易く書くことが非常に大事です。 FileUtils を使わなくても1行で書くことはできますが、決して良いコードにはならないでしょう。
コードは読ませるものです。誰にでも読み易いコードを書けるようになりたいと常々思います。
コメント
Eniinhtenlgg the world, one helpful article at a time.