2011-10-28 6 views
1

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

これは(isが入力ストリームである)私が今やっているものです:

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) { } 
+0

read(byte [] b、int off、int len)はフルバッファを読み取ることが保証されていないことをご理解ください。 –

答えて

0

これは、一度に4バイトを読み込もうとするので、intを直接読み取ることはできません。一度に1バイトずつストリームを読み込んでも問題がなければ、ループ内で

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

と言うことができます。

+0

あなたの解決に感謝します。実行時間は私が以前持っていたものよりも長いことが判明したので、私はそれを効率的にコード化する別の方法を探す必要があります。抽象基本クラスInputStreamの – confusedKid

+0

では、read(byte [])は抽象メソッドread()で定義されています。ただし、サブクラスはread(byte [])をオーバーライドして、一連の読み込みを使用すると効率的になります。あなたが大規模な配列を持っていない限り、2つの配列を使用することは、問題のあるメモリを占めるべきではありません。別の解決策は、バイト配列をそのまま使用することです。あまりにも悪いjavaには共用体がありません。 –

+0

残念ながら私はかなり大きな配列を持っています(イメージファイルのデコード用です)。それはアンドロイドプラットフォームにとってさらに大きな問題です! D: – confusedKid

0

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

ご提供いただいた情報のみで状況が可能かどうかわかりません。

+0

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

0

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(); 
}