如何判断一个循环在InputStream中有多远在Java中

时间:2011-11-22 19:54:50

标签: java url download inputstream filesize

我正在尝试制作一个下载器,以便我可以自动更新我的程序。以下是我目前的代码:

  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
    }
  }

正如您所看到的,我只是尝试使用进度条创建一个下载程序,但我不知道如何判断目标文件的总大小。 如何在文件下载之前确定要下载的字节数?

2 个答案:

答案 0 :(得分:3)

Stream是一个字节流,你不能问它剩下多少字节,你只需要读取它,直到它说“我已经完成”。现在,根据提供流的连接的建立方式,可能底层协议(例如HTTP)可以事先知道要发送的总长度......也许不是。为此,请参阅URLConnection.getContentLength()。但它可能会返回-1(='我不知道')。

BTW,您的代码不是读取字节流并将其写入文件的正确方法。首先,你使用的是Writer,你应该使用OutputStream(你要从字节转换为字符,然后再转换回字节 - 这会阻碍性能,如果收到的内容可能会损坏所有内容是二进制的,或者如果编码不匹配)。其次,它一次只能读写一个字节。

答案 1 :(得分:-1)

要获取文件的长度,请执行以下操作:

new File("System.getProperty("user.dir") + java.io.File.separatorChar + TITLE + ver + ".jar").length()