[英]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.