重複の可能性あり:
Javaでファイルをbyte[]に変換する
ファイルからデータを読み取り、それを Parcel にアンマーシャリングしたいのですが、ドキュメントでは、FileInputStream にそのすべてのコンテンツを読み取るメソッドがあることが明確ではありません。これを実装するには、次の操作を行います。
FileInputStream filein = context.openFileInput(FILENAME);
int read = 0;
int offset = 0;
int chunk_size = 1024;
int total_size = 0;
ArrayList<byte[]> chunks = new ArrayList<byte[]>();
chunks.add(new byte[chunk_size]);
//first I read data from file chunk by chunk
while ( (read = filein.read(chunks.get(chunks.size()-1), offset, buffer_size)) != -1) {
total_size+=read;
if (read == buffer_size) {
chunks.add(new byte[buffer_size]);
}
}
int index = 0;
// then I create big buffer
byte[] rawdata = new byte[total_size];
// then I copy data from every chunk in this buffer
for (byte [] chunk: chunks) {
for (byte bt : chunk) {
index += 0;
rawdata[index] = bt;
if (index >= total_size) break;
}
if (index>= total_size) break;
}
// and clear chunks array
chunks.clear();
// finally I can unmarshall this data to Parcel
Parcel parcel = Parcel.obtain();
parcel.unmarshall(rawdata,0,rawdata.length);
このコードは見苦しいと思います。質問は、ファイルから byte[] にデータを読み込む方法を美しくするにはどうすればよいかということです。:)
ベストアンサー1
昔々:
これらのいずれかに電話してください
byte[] org.apache.commons.io.FileUtils.readFileToByteArray(File file)
byte[] org.apache.commons.io.IOUtils.toByteArray(InputStream input)
から
ライブラリのフットプリントがAndroidアプリにとって大きすぎる場合は、commons-ioライブラリの関連クラスを使用するだけで済みます。
現在 (Java 7+ または Android API レベル 26+)
幸いなことに、nio パッケージには便利なメソッドがいくつかあります。たとえば、次のようになります。
byte[] java.nio.file.Files.readAllBytes(Path path)