2011-06-14 25 views
6

Bir wave dosyasından bir diziye bayt okumak istiyorum. Okunan bayt sayısı dalga dosyasının boyutuna bağlı olduğundan, maksimum 1000000 boyutuna sahip bir bayt dizisi oluşturuyorum. Ancak bu, dizinin sonundaki boş değerlerle sonuçlanır. Böylece, dinamik olarak artan bir dizi oluşturmak istedim ve ArrayList'in çözüm olduğunu buldum. Ancak AudioInputStream sınıfının read() işlevi, baytları yalnızca bayt dizisine okur! Değerleri bunun yerine bir ArrayList'e nasıl geçiririm?Bir ArrayList byte listesi oluşturma

+0

Bu bayt dizisiyle yapmak istediğiniz sonraki adımlar nelerdir? Belki de o büyük geçici tampona bile ihtiyacınız yok. – pcjuzer

cevap

13

Sen gibi byte dizisi olabilir:

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

diziler

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

geri çevirmek için (Sonra byte[] için Byte[] dönüştürmek için bir dönüştürücü yazmak zorunda olacaktır).

DÜZENLEME: Sen List<Byte> yanlış kullanıyorsunuz, ben nasıl basitçe ByteArrayOutputStream ile AudioInputStream okumayı göstermek sadece edeceğiz. Bir IOExceptionframeSize eğer atılır

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

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

byte[] soundBytes = baos.toByteArray(); 

PS1 eşit değildir. Bu nedenle çok gibi verileri okumak için bir bayt tampon kullanımı:

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(); 
+0

***** java: 41: bulamıyor sembolü sembolü: yöntem okundu (java.util.List ) konum: sınıf javax.sound.sampled.AudioInputStream ais.read (arabellek); –

+0

Bu, derlenmiyor: 'List ' öğesini bir 'bayt []' haline dönüştürmek için otomatik/yerleşik bir yol yoktur. Bunun dışında, bir 'List ' kullanmak ** korkunç derecede ** alan verimsizdir. –

+0

@Joachim Sauer, haklısınız, “Byte” dan byte'a bir dönüşüm olması gerektiğini unutmuşum. Cevabı değiştirmek. –

17

ArrayList çözüm değildir, ByteArrayOutputStream çözümdür. Bir ByteArrayOutputStream oluşturun, baytlarınızı yazın ve sonra baytları almak için toByteArray()'u çağırın. Böyle

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

şey yapmalıdır: kodunuzu gibi görünmesi gerektiğine dair

Örnek

kod biraz yanlışsa
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; 
    } 
} 

üzgünüm. Java'yı bir süredir yapmadım. Ve burada her zaman daha bayt okur bunu yapmanın alternatif yolu:

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

bir süre (doğru) döngü :)

Edit olarak uygularım Ayrıca

, dikkatli ol Her iki read() yönteminin bir IOException attığını unutmayın - bu işlem okuyucu için bir egzersiz olarak bırakılır!

+0

'' '' '' '' '' '' '' '' yi kullanmamalı ve bayt tarafından bayt okunması çok yavaştır. – Kaj

+0

Bir dizi yerine bir “Liste” istiyor. Ayrıca, yığınlarda okuma için alternatif bir örnek verdim. –

+0

o bir 'List' istiyor, çünkü o büyüklüğü bilmiyor. Bu, 'List' kullanmasa bile, doğru çözümdür. –