Как определить, насколько далеко вдоль InputStream находится цикл в Java - PullRequest
0 голосов
/ 22 ноября 2011

Я пытаюсь сделать загрузчик, чтобы я мог автоматически обновлять свою программу. Ниже приведен мой код:

  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 ]

3 голосов
/ 23 ноября 2011

Поток - это поток байтов, вы не можете спросить его, сколько байтов осталось, вы просто читаете из него, пока он не скажет «я готов». Теперь, в зависимости от того, как установлено соединение, обеспечивающее поток, , возможно, базовый протокол (например, HTTP) может заранее знать общую длину для отправки ... возможно, нет. Для этого см. URLConnection.getContentLength(). Но вполне может вернуть -1 (= «Я не знаю»).

Кстати, ваш код не является правильным способом для чтения потока байтов и записи его в файл. Во-первых, вы используете Writer, когда вы должны использовать OutputStream (вы конвертируете из байтов в символы, а затем обратно в байты - это снижает производительность и может повредить все, если полученный контент является двоичным, или если кодировки не совпадают). Во-вторых, неэффективно читать и записывать по одному байту за раз.

0 голосов
/ 23 ноября 2011

Чтобы получить длину файла, вы делаете это:

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