2011-06-14 21 views
6

का एक ऐरेलिस्ट बनाएं, मैं एक लहर फ़ाइल से बाइट को सरणी में पढ़ना चाहता हूं। चूंकि बाइट्स पढ़ने की संख्या तरंग फ़ाइल के आकार पर निर्भर करती है, इसलिए मैं 1000000 के अधिकतम आकार के साथ एक बाइट सरणी बना रहा हूं। लेकिन इसके परिणामस्वरूप सरणी के अंत में खाली मान होते हैं। तो, मैं एक गतिशील रूप से बढ़ती सरणी बनाना चाहता था और मैंने पाया कि ऐरेलिस्ट समाधान है। लेकिन AudioInputStream क्लास के read() फ़ंक्शन बाइट्स को केवल बाइट सरणी में पढ़ता है! मैं मानों को इसके बजाय ArrayList में कैसे पास करूं?बाइट्स

+0

उस बाइट सरणी के साथ आप अगले चरण क्या करना चाहते हैं? शायद आपको उस बड़े अस्थायी बफर की भी आवश्यकता नहीं है। – pcjuzer

उत्तर

13

आप की तरह बाइट की एक सरणी हो सकता है:

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

यह सरणियों

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

वापस करने के लिए परिवर्तित करने के लिए (उसके बाद, आप byte[] को Byte[] को बदलने के लिए एक कनवर्टर लिखने के लिए होगा)।

संपादित करें: आप List<Byte> गलत प्रयोग कर रहे हैं, मैं तुम्हें कैसे बस ByteArrayOutputStream साथ AudioInputStream पढ़ने के लिए सिर्फ दिखाएंगे।

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

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

byte[] soundBytes = baos.toByteArray(); 

पुनश्च एक IOException अगर frameSize फेंक दिया जाता है 1 के बराबर नहीं है। इसलिए तो की तरह, डेटा को पढ़ने के लिए एक बाइट बफर का उपयोग करें:

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

***** जावा: 41: प्रतीक नहीं मिल सकता प्रतीक: विधि पढ़ें (java.util.List ) स्थान: वर्ग javax.sound.sampled.AudioInputStream ais.read (बफर); –

+0

यह संकलित नहीं करता है: 'सूची ' को 'बाइट []' में बदलने के लिए कोई स्वचालित/अंतर्निहित तरीका नहीं है। इसके अलावा, 'सूची ' का उपयोग करके ** बहुत ** अंतरिक्ष-अक्षम है। –

+0

@ जोचिम सॉर, आप सही हैं, मैं भूल गया था कि 'बाइट' से बाइट तक रूपांतरण होना आवश्यक है। उत्तर संशोधित करना –

17

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

कुछ इस तरह करना चाहिए: क्या अपने कोड की तरह दिखना चाहिए की

उदाहरण

अगर कोड एक सा गलत है
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; 
    } 
} 

क्षमा करें। मैंने थोड़ी देर के लिए जावा नहीं किया है। और यहाँ है कि और अधिक बाइट्स हर बार पढ़ता है यह कर का एक वैकल्पिक तरीका है::

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

इसके अलावा, सावधान यदि आप थोड़ी देर के (सही) पाश :)

संपादित के रूप में यह लागू करते हो ध्यान दें कि दोनों पढ़ने() विधियों को IOException फेंक देते हैं - इसे संभालने के लिए पाठक के लिए अभ्यास के रूप में छोड़ा जाता है!

+0

उसे 'बाइट' की 'सूची' का उपयोग नहीं करना चाहिए, और बाइट द्वारा बाइट पढ़ना बहुत धीमा है। – Kaj

+0

वह एक सरणी के बजाय 'सूची' चाहता है। इसके अलावा, मैंने भाग में पढ़ने के लिए एक वैकल्पिक उदाहरण प्रदान किया है। –

+0

वह एक 'सूची' चाहता है क्योंकि वह आकार के सामने के बारे में नहीं जानता है। यह सही समाधान है, यहां तक ​​कि 'हालांकि यह' सूची 'का उपयोग नहीं करता है। –

संबंधित मुद्दे