ウェーブファイルから配列にバイトを読み込みたい。読み取られるバイト数はWaveファイルのサイズに依存するため、最大サイズが1000000のバイト配列を作成しています。ただし、これにより、配列の最後に空の値が表示されます。そこで、動的に増加する配列を作成したかったのですが、ArrayListが解決策であることがわかりました。ただし、AudioInputStreamクラスのread()関数は、バイトをバイト配列にのみ読み取ります。代わりに値をArrayListに渡すにはどうすればよいですか?
次のようなバイトの配列を持つことができます。
List<Byte> arrays = new ArrayList<Byte>();
配列に戻すには
Byte[] soundBytes = arrays.toArray(new Byte[arrays.size()]);
(次に、Byte[]
をbyte[]
に変換するコンバーターを作成する必要があります)。
EDIT:List<Byte>
を間違って使用しています。AudioInputStream
をByteArrayOutputStream
で簡単に読み取る方法を説明します。
AudioInputStream ais = ....;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int read;
while((read = ais.read()) != -1) {
baos.write(read);
}
byte[] soundBytes = baos.toByteArray();
[〜#〜] ps [〜#〜]IOException
が1
と等しくない場合、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();
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();
このようなことをする必要があります:
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をスローすることに注意してください-これを処理することは、読者の練習問題として残されています!