2013-01-12 43 views
1

我用下面的代碼從Web服務器上的wav文件中獲取數據。 getFormat(),getFormatLength(),totallength和讀取字節,每個執行http訪問和服務器日誌顯示有3個訪問。有沒有辦法讓它成爲一次旅行?如何避免來自java程序的多個http訪問wave資源文件?

try { 
    audioInputStream = AudioSystem.getAudioInputStream(url);//soundFile); 
    format = audioInputStream.getFormat(); 
    totallength = audioInputStream.getFrameLength()*format.getFrameSize(); 
    waveData = new byte[(int)totallength]; 
    int total=0; 
    int nBytesRead = 0; 
    try { 
     while (nBytesRead != -1 && total<totallength) { 
      nBytesRead = audioInputStream.read(waveData, total, (int) totallength); 
      if (nBytesRead>0) 
       total+=nBytesRead; 
      } 
    ... 
+1

是所有那些fullworthy GET請求(返回整個文件中響應正文),或者是getFormat()和getFormatLength()HEAD請求(它只返回HTTP頭,因此返回一個空的響應主體)中的頭幾個。我希望他們是「只是」頭應該是非常便宜的請求。或者,服務器是由您自己維護的(例如,servlet?),它是不是完全正確地完成它的工作,並將整個文件還原到HEAD上? – BalusC

+0

@BalusC我使用了servlt,我想我需要更新該代碼。但我也在想,只是使用Joop Eggen的建議,剛開始時不知道大小就讀了整個流。我意識到格式不被使用。這樣可以減少往返時間。 –

回答

1

,因爲它看起來你是第一次讀取整個文件到內存中,爲什麼不讀書讀所有第一。

// Read the audio file into waveData: 
    BufferedInputStream in = new BufferedInputStream(url.openStream()); 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    for (;;) { 
     int b = in.read(); 
     if (b == -1) { 
      break; 
     } 
     bos.write(b); 
    } 
    in.close(); 
    bos.close(); 
    byte[] waveData = bos.toByteArray(); 

    // Create the AudioInputSteam: 
    ByteArrayInputStream bis = new ByteArrayInputStream(waveData); 
    AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(bis); 
+0

從內存中逐字節讀取會非常緩慢。 –

+1

唯一的模式是使用緩衝區而不是逐字節讀取。但是這個方法奏效了! –

相關問題