web-dev-qa-db-ja.com

バイトのArrayListを作成します

ウェーブファイルから配列にバイトを読み込みたい。読み取られるバイト数はWaveファイルのサイズに依存するため、最大サイズが1000000のバイト配列を作成しています。ただし、これにより、配列の最後に空の値が表示されます。そこで、動的に増加する配列を作成したかったのですが、ArrayListが解決策であることがわかりました。ただし、AudioInputStreamクラスのread()関数は、バイトをバイト配列にのみ読み取ります。代わりに値をArrayListに渡すにはどうすればよいですか?

7
Uday Kanth

次のようなバイトの配列を持つことができます。

List<Byte> arrays = new ArrayList<Byte>();

配列に戻すには

Byte[] soundBytes = arrays.toArray(new Byte[arrays.size()]);

(次に、Byte[]byte[]に変換するコンバーターを作成する必要があります)。

EDIT:List<Byte>を間違って使用しています。AudioInputStreamByteArrayOutputStreamで簡単に読み取る方法を説明します。

AudioInputStream ais = ....;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int read;

while((read = ais.read()) != -1) {
    baos.write(read);
}

byte[] soundBytes = baos.toByteArray();

[〜#〜] ps [〜#〜]IOException1と等しくない場合、frameSizeがスローされます。したがって、次のように、バイトバッファを使用してデータを読み取ります。

AudioInputStream ais = ....;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int bytesRead = 0;

while((bytesRead = ais.read(buffer)) != -1) {
    baos.write(buffer, 0, bytesRead);
}

byte[] soundBytes = baos.toByteArray();
16
Buhake Sindi

ArrayListは解決策ではありません、 ByteArrayOutputStream が解決策です。 ByteArrayOutputStreamを作成してバイトを書き込み、toByteArray()を呼び出してバイトを取得します。

コードがどのように見えるかの例:

in = new BufferedInputStream(inputStream, 1024*32);
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] dataBuffer = new byte[1024 * 16];
int size = 0;
while ((size = in.read(dataBuffer)) != -1) {
    out.write(dataBuffer, 0, size);
}
byte[] bytes = out.toByteArray();
27
Kaj

このようなことをする必要があります:

List<Byte> myBytes = new ArrayList<Byte>();

//assuming your javax.sound.sampled.AudioInputStream is called ais

while(true) {
  Byte b = ais.read();
  if (b != -1) { //read() returns -1 when the end of the stream is reached
    myBytes.add(b);
  } else {
    break;
  }
}

コードが少し間違っている場合は申し訳ありません。しばらくの間、Javaを実行していません。

また、while(true)ループとして実装する場合は注意してください:)

編集:そして、毎回より多くのバイトを読み取る別の方法があります:

int arrayLength = 1024;
List<Byte> myBytes = new ArrayList<Byte>();

while(true) {

  Byte[] aBytes = new Byte[arrayLength];
  int length = ais.read(aBytes); //length is the number of bytes read

  if (length == -1) {  //read() returns -1 when the end of the stream is reached
    break; //or return if you implement this as a method
  } else if (length == arrayLength) {  //Array is full
    myBytes.addAll(aBytes);
  } else {  //Array has been filled up to length

    for (int i = 0; i < length; i++) {
      myBytes.add(aBytes[i]);
    }
  }
}

両方のread()メソッドがIOExceptionをスローすることに注意してください-これを処理することは、読者の練習問題として残されています!

4
Brian Beckett