1. ホーム
  2. java

Javaでファイルをbyte[]配列に読み込むエレガントな方法 [duplicate]

2023-09-24 09:53:48

質問

重複の可能性があります。

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[]に美しく読み込むのでしょうか?)

どのように解決するのですか?

長い時間前に。

これらのいずれかを呼び出す

byte[] org.apache.commons.io.FileUtils.readFileToByteArray(File file)
byte[] org.apache.commons.io.IOUtils.toByteArray(InputStream input) 

から

http://commons.apache.org/io/

ライブラリのフットプリントが Android アプリにとって大きすぎる場合、commons-io ライブラリから関連するクラスを使用することができます。

今日 (Java 7+ または Android API Level 26+)

幸運なことに、現在、nio パッケージにはいくつかの便利なメソッドがあります。たとえば

byte[] java.nio.file.Files.readAllBytes(Path path)

Javadocはこちら