0

我是使用 java 下载文件的新手,如果这是一个愚蠢的问题,我很抱歉,但我已经搜索了 2 天,但找不到解决方案。我在小程序中使用 JPanel,我想在进度条中显示下载进度。(也许下载不是正确的词,它更可能是初始化)

我想要的是显示从 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);
    }
}

有什么办法可以做到这一点?

提前致谢。

4

1 回答 1

0

URLConnection最简单的方法是在您已经存在的对象上打开一个URL并查询Content-Lengthhttp-header 字段。使用getContentLength()- 方法执行此操作。

注意如果您正在下载大文件,则int可能不足以容纳内容长度。因此, getContentLengthLong()应该首选。此方法 从 Java 7 开始可用

这将保存文件的长度(以字节为单位)。当您通过 阅读时AudioInputStream.read(),此方法将返回每次读取的实际字节数。

伪代码

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

另见

于 2013-03-02T16:28:49.197 回答