Javaで入力ストリームから読み込み中にバイトをintに変更する方法はありますか?

私はバイト配列にInputStreamを持つファイルを読み込み、次に各バイトをintに変更しています。次に、intを別の配列に格納します。これをより効率的にする方法はありますか?具体的には、2つではなく1つの配列を使用する方法がありますか?両方の配列を割り当てることは私のプログラムには長すぎます。

これは私が今やっていることです(はInputStreamです)。

byte[] a = new byte[num];
int[] b = new int[num];

try {
    is.read(a, 0, num);
    for (int j = 0; j < nPixels; j++) {
        b[j] = (int) a[j] & 0xFF; //converting from a byte to an "unsigned" int
    }
} catch (IOException e) { }
1
read(byte [] b、int off、int len)がフルバッファを読み取ることが保証されていないことをご存じでしょうか?
追加された 著者 Mark Rotteveel,

3 答え

見てみましょう...それは一度に4バイトを読み込もうとするので、あなたは直接intを読むことができません。あなたは言えた

int_array[j] = (int)is.read();

一度に1バイトずつストリームを読み込んでも問題ない場合はループの内側にあります。

0
追加された
抽象基本クラスInputStreamでは、read(byte [])は抽象メソッドread()によって定義されています。ただし、サブクラスはread(byte [])をオーバーライドして、一連の読み込みを使用すると効率的になります。あなたが大規模な配列を持っていない限り、2つの配列を使用することは、問題のあるメモリを占めるべきではありません。別の解決策は、バイト配列をそのまま使用することです。あまりにも悪いjavaには共用体がありません。
追加された 著者 aleph_null,
あなたのソリューションに感謝します。実行時間は私が以前持っていたものよりも長いことが判明したので、私はそれを効率的にコード化する別の方法を探す必要があります。
追加された 著者 confusedKid,
残念ながら私はかなり大きな配列を持っています(イメージファイルのデコード用です)。それはアンドロイドプラットフォームにとってさらに大きな問題です! D:
追加された 著者 confusedKid,

DataInputStream または FileInputStream ?特定のデータ型をInputStreamから直接読み取ることができるメソッドはほかにもたくさんあります。

あなたが提供した情報だけでこれがあなたの状況で可能かどうかはわかりません。

0
追加された
私の場合、ストリームの各バイトをintに変換していますが、DataInputStreamのようなものが4バイトをintに入れてしまうのではないかと心配しています。
追加された 著者 confusedKid,

なぜintを返す、引数のないメソッドInputStream.read()を使わないのですか?

File file = new File("/tmp/test");
FileInputStream fis = new FileInputStream(file);
int fileSize = (int) file.length();//ok for files < Integer.MAX_SIZE bytes
int[] fileBytesAsInts = new int[fileSize];
for(int j = 0; j < fileSize; j++) {
    fileBytesAsInts[j] = fis.read();
}
0
追加された