Java 中如何判断循环沿 InputStream 走了多远

发布于 2024-12-17 15:18:33 字数 1516 浏览 1 评论 0原文

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

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

如您所见,我只是想制作一个带有进度条的下载器,但我不知道如何判断目标文件的总大小。 如何知道文件下载完成之前要下载多少字节?

I'm trying to make a downloader so I can automatically update my program. The following is my code so far:

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

As you can see, I'm just trying to make a downloader with a progress bar, but I don't know how to tell the total size of the target file. How can I tell how many bytes are going to be downloaded before the file is done downloading?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

貪欢 2024-12-24 15:18:33

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

顺便说一句,您的代码不是读取字节流并将其写入文件的正确方法。一方面,当您应该使用 OutputStream 时,您正在使用 Writer(您正在从字节转换为字符,然后再转换回字节 - 这会影响性能并可能如果接收到的内容是二进制的,或者编码不匹配,则会损坏所有内容)。其次,一次读写一个字节效率低下。

A Stream is a flow of bytes, you can't ask it how many bytes are remaining, you just read from it until it says 'i'm done'. Now, depending on how the connection that provides the stream is stablished, perhaps the underlying protocol (HTTP, for example) can know in advance the total length to be sent... perhaps not. For this, see URLConnection.getContentLength(). But it might well return -1 (= 'I don't know').

BTW, your code is not the proper way to read a stream of bytes and write it to a file. For one thing, you are using a Writer, when you should use a OutputStream (you are converting from bytes to characters, and then back to bytes - this hinders performance and might corrupt everything if the received content is binary, or if the encodings don't match). Secondly, its inefficient to read and write one byte at a time.

兰花执着 2024-12-24 15:18:33

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

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

To get the length of the file, you do this:

new File("System.getProperty("user.dir") + java.io.File.separatorChar + TITLE + ver + ".jar").length()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文