Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获取使用audioinputstream java下载文件的进度_Java_Progress Bar - Fatal编程技术网

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

如何获取使用audioinputstream java下载文件的进度,java,progress-bar,Java,Progress Bar,我刚开始用java下载文件,如果这是一个愚蠢的问题,我很抱歉,但我已经搜索了2天,没有找到解决方案。我在applet中使用JPanel,我想在progressBar中显示下载进度。(可能download不是正确的词,更可能是初始化) 我想要的是显示从URL下载wav文件的过程。我不是要显示读取过程(稍后我会让用户知道文件正在处理)。我只想获得ais=AudioSystem.getAudioInputStream(URL)的进度 我尝试使用ProgressMonitorInputStream,但这

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

我想要的是显示从URL下载wav文件的过程。我不是要显示读取过程(稍后我会让用户知道文件正在处理)。我只想获得ais=AudioSystem.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);
    }
}
public void readFile(){
字节[]数据=null;
音频输入流ais=null;
试一试{
URL=新URL(“http://www-mmsp.ece.mcgill.ca/documents/AudioFormats/WAVE/Samples/AFsp/M1F1-Alaw-AFsp.wav");
ais=AudioSystem.getAudioInputStream(url);
AudioFormat=ais.getFormat();
numberOfChannels=format.getChannels();
AudioFormat TargetFormat=新的AudioFormat(format.getSampleRate(),16,NumberOfChannel,true,false);
AudioInputStream desiredFormatStream=AudioSystem.getAudioInputStream(TargetFormat,ais);
数据=新字节[4];
int totalSampleCount=ais.available()/(format.getSampleSizeInBits()/8);
音频=新的双精度[totalSampleCount];
对于(int i=0;i音频[i]=((短)((数据[1]&0xFF)最简单的方法是打开一个已存在的
URL
-对象,并查询
内容长度
http头字段。使用

注意如果下载的是大文件,
int
可能不够大,无法容纳内容长度。因此, 应首选。此方法是 从Java 7开始提供

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

伪代码

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

  • 举例说明如何使用内容长度
  • 关于溪流的文章