2013-10-24 104 views
0

我想從USB讀取一個Mp3文件並將數據寫入不同的緩衝區。請幫助我,如果有任何好的方法來做到這一點。如何在Java中將一個Mp3文件寫入多個字節數組?

我可以將整個數據讀入一個字節數組。但是我想做一些事情,比如將第一個8字節寫入第一個字節數組,然後將第8個字節寫入第二個字節數組,等等直到數據結束。請儘可能提供示例代碼。正如我可以很快掌握,如果我在我面前有任何例子。

下面是我的代碼,我必須讀取數據。

public class ReadFileInByteArrayWithFileInputStream { 
    static byte[] buffer1 ; 

    @SuppressWarnings("null") 

    public static void main() { 
     File file = new File("/mnt/media/wayfaring_stranger.mp3"); 
     FileInputStream fin = null; 
     FileOutputStream fout=null; 


     try 
     { 
      // create FileInputStream object 
      fin = new FileInputStream(file); 
      byte fileContent[] = new byte[(int) file.length()]; 
      // Reads up to certain bytes of data from this input stream into an 
      // array of bytes. 
      fin.read(fileContent); 
      // create string from byte array 
      String s = new String(fileContent); 
      System.out.println("File content: " + s); 

      buffer1 = new byte[8]; 



     } 

     catch (FileNotFoundException e) 
     { 
      System.out.println("File not found" + e); 
     } 
     catch (IOException ioe) { 
      System.out.println("Exception while reading file " + ioe); 
     } 
     finally { 

      // close the streams using close method 
      try 
      { 
       if (fin != null) { 
        fin.close(); 
       } 
      } 
      catch (IOException ioe) 
      { 
       System.out.println("Error while closing stream: " + ioe); 
      } 
     } 
    } 
} 
+0

僅供參考,Stackoverflow不是代碼存儲庫,因此您不能要求代碼/示例。 –

+1

file.length()返回抽象路徑的長度。不要使用它 – Keerthivasan

+0

你的代碼被打亂開始,因爲你沒有使用'fin.read(buffer)'(它可能沒有讀取所有數據)的返回值,然後你將這個任意二進制數據轉換爲字符串,當它不是文本*時。噢,'file.length()'部分也是如此... –

回答

0

首先,分裂一個大文件到緩衝區小會是令人難以置信的浪費內存。每個對象的開銷與數據本身大小相同(或大於)。然而,將輸入流分成多個塊的想法本質上不成問題。

我認爲你錯過的概念是使用收集緩衝區,而不是每個人都有一個單獨的變量。因此,您將不會有buffer1,buffer2,buffer3等等,其中每個變量都是byte[],您可以使用一個稱爲buffers(或其他)的List<byte[]>變量。

下面是一些代碼做閱讀:

public static List<byte[]> readBuffers(InputStream input, int maxBufferSize) 
     throws IOException { 
    List<byte[]> ret = new ArrayList<byte[]>(); 

    while (true) { 
     byte[] buffer = new byte[maxBufferSize];   
     int bufferRead = 0; 
     while (bufferRead < buffer.length) { 
      int chunk = input.read(buffer, bufferRead, buffer.length - bufferRead); 
      if (chunk == -1) { 
       // End of data. 

       // If there's no data in this buffer, our list is fine. Otherwise 
       // we need to create a smaller buffer and add that. 
       if (bufferRead != 0) { 
        byte[] finalBuffer = new byte[bufferRead]; 
        System.arraycopy(buffer, 0, finalBuffer, 0, bufferRead); 
        ret.add(finalBuffer); 
       } 
       return ret; 
      } 
     } 
     // Full buffer. Add it to the list, and start again. 
     ret.add(buffer); 
    } 
} 

注意如何:

  • 我們始終使用InputStream.read返回值。不要忽視它,因爲不能保證它將讀取與您在單個調用中要求的數據一樣多的數據。
  • 我們不要嘗試將數據轉換爲字符串。除非您真正讀取最初爲文本數據的字節,否則不應使用String構造函數 - 並且如果讀取最初爲文本數據的字節,則應指定編碼。

或者,如果你實際上只是想在文件中每塊傳遞給其他一些功能 - 哈希計算,例如 - 你不需要在內存中的整個文件都沒有。相反,你會封裝「塊處理器」的想法並將其傳遞給方法。在上面的方法中添加到列表中的位置,您可以調用塊處理器。

+0

謝謝你。我正試圖按照你的方法。如果這對我有用,我會回來。 – SajidKhan

0
buffer = new byte[8]; 
        input.read(buffer); 
      //  input.read(buffer, offset, length); 
        Log.i("TvPlayerFunctionalTestApp", "buffer: "+ Arrays.toString(buffer)); 
        buffer1 = new byte[8]; 
        input.read(buffer1); 
+0

上述方法我用過。它給了我我需要的東西。剛剛測試過。 – SajidKhan

+0

這段代碼被破壞 - 它*假定* read'調用將始終填充緩衝區。 –

相關問題