読み込んだリソースを必要十分な配列長にする
リソース上のファイルからbyte配列でデータを取得する場合にデータを必要十分な配列長に格納する実装を書いてみました。
private byte[] _getFileContentInByteArray(InputStream is, byte[] registeredArr, int bufArrLen, int depth) throws IOException { int registeredArrLen = (registeredArr == null) ? 0 : registeredArr.length; // buffering array to read byte[] bufArr = new byte[bufArrLen]; is.read(bufArr); Integer endIdxOfArr = null; // check end index of array for (int i = 0; i < bufArrLen; i++) { if (endIdxOfArr != null) { // continued byte 0 if (bufArr[i] != 0) endIdxOfArr = null; } else { // first byte 0 if (bufArr[i] == 0) endIdxOfArr = i; } } // might be binary file if (endIdxOfArr != null && endIdxOfArr > bufArrLen - 16) endIdxOfArr = null; byte[] resultArr = null; // merge registered array and buffering array if (endIdxOfArr == null) { // not end index of array if (registeredArrLen == 0) { // first buffering resultArr = new byte[bufArrLen]; for (int i = 0; i < bufArrLen; i++) resultArr[i] = bufArr[i]; } else { resultArr = new byte[registeredArrLen + bufArrLen]; System.arraycopy(registeredArr, 0, resultArr, 0, registeredArrLen); System.arraycopy(bufArr, 0, resultArr, registeredArrLen, bufArrLen); registeredArr = null; bufArr = null; } // recursive execute depth = depth + 1; return _getFileContentInByteArray(is, resultArr, bufArrLen * depth, depth); } else { // end index of array if (registeredArrLen == 0) { resultArr = new byte[endIdxOfArr]; for (int i = 0; i < endIdxOfArr; i++) { resultArr[i] = bufArr[i]; } } else { resultArr = new byte[registeredArrLen + endIdxOfArr]; System.arraycopy(registeredArr, 0, resultArr, 0, registeredArrLen); System.arraycopy(bufArr, 0, resultArr, registeredArrLen, endIdxOfArr); } } return resultArr; }
もしかして、車輪の再発明・・なのかな。
追記:(10/4)
画像などのバイナリファイルの場合、途中に0のbyteが入ってくるので、判定を修正しました。
バイナリファイルの場合、テキストでいうEOF(0x1A)も途中で普通に出てくるので、ある程度余裕をもって見てみて「もうずっと0が続いてるからファイルは終わってる」というジャッジをするしかないと思っているのですが、正しいんでしょうか。
ただ、バッファ配列の切れ目の末尾でずっと0が続いた場合、ファイルが終わったのかどうか不明なので、とりあえず16個以下の0の連続だったら次もみるようにしています。
どれくらいが妥当なのか把握していません。16というのはいくつかテストした結果で10連続を超える箇所が見つからなかったので、切りのいいところでそうしているだけという感じです。