有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何获取使用audioinputstream java下载文件的进度

我刚开始用java下载文件,如果这是一个愚蠢的问题,我很抱歉,但我已经搜索了2天,没有找到解决方案。我在applet中使用JPanel,我想在progressBar中显示下载进度。(可能下载不是正确的词,更可能是初始化)

我想展示的是从URL下载wav文件的过程。我并不想显示读取过程(稍后我会让用户知道文件正在处理中)我只想了解一下ais=音响系统的进展情况。getAudioInputStream(url)

我尝试使用ProgressMonitorInputStream,但这对我不起作用,因为我想将进度条添加到JFrame中。我一直在寻找swingWorker,但它的使用并没有给我想要的进步

这是我的read函数。我也改变了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);
    }
}

有没有办法做到这一点

提前谢谢


共 (1) 个答案

  1. # 1 楼答案

    最简单的方法是在已经存在的URL-对象上打开一个^{}并查询Content-Lengthhttp头字段。使用^{}-method来执行此操作

    NOTE if you're downloading large files, an int might not be big enough to hold the content length. Therefor, getContentLengthLong() should be prefered. This method is available since Java 7.

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

    伪代码

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

    另见