我正在尝试制作一个下载器,以便我可以自动更新我的程序。以下是我目前的代码:
public void applyUpdate(final CharSequence ver)
{
java.io.InputStream is;
java.io.BufferedWriter bw;
try
{
String s, ver;
alertOf(s);
updateDialogProgressBar.setIndeterminate(true);//This is a javax.swing.JProgressBar which is configured beforehand, and is displayed to the user in an update dialog
is = latestUpdURL.openStream();//This is a java.net.URL which is configured beforehand, and contains the path to a replacement JAR file
bw = new java.io.BufferedWriter(new java.io.FileWriter(new java.io.File(System.getProperty("user.dir") + java.io.File.separatorChar + TITLE + ver + ".jar")));//Creates a new buffered writer which writes to a file adjacent to the JAR being run, whose name is the title of the application, then a space, then the version number of the update, then ".jar"
updateDialogProgressBar.setValue(0);
//updateDialogProgressBar.setMaximum(totalSize);//This is where I would input the total number of bytes in the target file
updateDialogProgressBar.setIndeterminate(false);
{
for (int i, prog=0; (i = is.read()) != -1; prog++)
{
bw.write(i);
updateDialogProgressBar.setValue(prog);
}
bw.close();
is.close();
}
}
catch (Throwable t)
{
//Alert the user of a problem
}
}
正如您所看到的,我只是尝试使用进度条创建一个下载程序,但我不知道如何判断目标文件的总大小。 如何在文件下载之前确定要下载的字节数?
答案 0 :(得分:3)
Stream是一个字节流,你不能问它剩下多少字节,你只需要读取它,直到它说“我已经完成”。现在,根据提供流的连接的建立方式,可能底层协议(例如HTTP)可以事先知道要发送的总长度......也许不是。为此,请参阅URLConnection.getContentLength()
。但它可能会返回-1(='我不知道')。
Writer
,你应该使用OutputStream
(你要从字节转换为字符,然后再转换回字节 - 这会阻碍性能,如果收到的内容可能会损坏所有内容是二进制的,或者如果编码不匹配)。其次,它一次只能读写一个字节。
答案 1 :(得分:-1)
要获取文件的长度,请执行以下操作:
new File("System.getProperty("user.dir") + java.io.File.separatorChar + TITLE + ver + ".jar").length()