簡體   English   中英

如何獲得使用AudioInputStream Java下載文件的進度

[英]How to get progress of downloading a file with audioinputstream java

我是剛開始使用Java下載文件,但是如果問題很愚蠢,請問對不起,但是我搜索了2天,卻找不到解決方案。 我在applet中使用JPanel,我想在progressBar中顯示下載進度。(也許下載不是正確的單詞,它更有可能是初始化)

我要顯示的是從URL下載wav文件的過程。我並不是要顯示讀取過程(我會讓用戶知道文件正在稍后處理。)我只是想了解進度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);
    }
}

有什么辦法可以做到這一點?

提前致謝。

最簡單的方法是在您已經存在的URL上打開URLConnection並查詢Content-Length http-header字段。 使用getContentLength()方法進行操作。

注意如果要下載大文件,則int可能不足以容納內容長度。 因此,應首選getContentLengthLong() 從Java 7開始可以使用此方法。

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

偽碼

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

另請參閱

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM