読み込んだリソースを必要十分な配列長にする

リソース上のファイルから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連続を超える箇所が見つからなかったので、切りのいいところでそうしているだけという感じです。