2013-03-02 40 views
0

我是新來下載一個文件與Java和抱歉,如果它是一個愚蠢的問題,但我已經搜索了2天,並無法獲得解決方案。我在applet中使用JPanel,我想在progressBar中顯示下載進度(可能下載的不是正確的字,它更可能是初始化)如何獲取與audioinputstream java下載文件的進度

我想要的是顯示wav的下載過程文件從URL.I不意味着顯示讀取過程(我會讓用戶知道文件正在處理以後。)我只是想獲得進展ais = AudioSystem.getAudioInputStream(url);

我試圖使用ProgressMonitorInputStream但這對我不起作用,因爲我想將進度條添加到我的JFrame中。我尋找swingWorker但它的使用並沒有給我我想要的進展。

這裏是我的閱讀功能。我也根據我的需要更改wav格式。

public void readFile() { 

    byte[] data = null; 
    AudioInputStream ais = null; 
    try { 
     URL url = new URL("http://www-mmsp.ece.mcgill.ca/documents/AudioFormats/WAVE/Samples/AFsp/M1F1-Alaw-AFsp.wav"); 
     ais = AudioSystem.getAudioInputStream(url); 


     AudioFormat format = ais.getFormat(); 
     numberOfChannels = format.getChannels(); 



     AudioFormat TargetFormat = new AudioFormat(format.getSampleRate(), 16, numberOfChannels, true, false); 
     AudioInputStream desiredFormatStream = AudioSystem.getAudioInputStream(TargetFormat,ais); 
     data = new byte[4]; 
     int totalSampleCount = ais.available()/(format.getSampleSizeInBits()/8); 


     audio = new double[totalSampleCount]; 
     for (int i = 0; i < totalSampleCount-1; i=i+2) { 
      desiredFormatStream.read(data); 

       if(!TargetFormat.isBigEndian()){ 
        audio[i] = ((short) (((data[1] & 0xFF) << 8) + (data[0] & 0xFF)))/((double) MAX_16_BIT); 
        audio[i+1] = ((short) (((data[3] & 0xFF) << 8) + (data[2] & 0xFF)))/((double) MAX_16_BIT); 
       } 
       else { 
        audio[i] = ((short) (((data[0] & 0xFF) << 8) + (data[1] & 0xFF)))/((double) MAX_16_BIT); 
        audio[i+1] = ((short) (((data[2] & 0xFF) << 8) + (data[3] & 0xFF)))/((double) MAX_16_BIT); 
       } 

     } 

     StdAudio.open(TargetFormat); 

    } catch (Exception e) { 
     System.out.println(e.getMessage()); 
     throw new RuntimeException("Could not read " + filename); 
    } 
} 

有什麼辦法可以達到這個目的嗎?

在此先感謝。

回答

0

最簡單的方法是在您已有的URL對象上打開URLConnection並查詢Content-Length http-header字段。使用getContentLength()-method來做到這一點。

注意如果你下載大文件,一個int可能不是大到足以容納內容的長度。因此, getContentLengthLong()應該是首選。自Java 7以來,此方法爲

這將以字節爲單位保存文件的長度。當您通過AudioInputStream.read()讀取時,此方法將返回每次讀取的實際字節數。

僞代碼

long totalLength = con.getContentLengthLong(); 
while still reading{ 
    long totalBytesRead += in.read(); 
    print "Process: "+(totalBytesRead * 100/totalLength); 
} 

參見: