2013-01-12 27 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

唯一的模式是使用缓冲区而不是逐字节读取。但是这个方法奏效了! –

相关问题