Avatar billede casualty Nybegynder
29. januar 2003 - 12:16 Der er 10 kommentarer og
1 løsning

Hvor mange kb downloadet?

Jeg har denne downloadfunktion der volder mig lidt problemer:public void run()
  {
    try
    {
      DownFrame frame= new DownFrame(this);
      Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
      Dimension frameSize = frame.getSize();
      if (frameSize.height > screenSize.height)
      {
        frameSize.height = screenSize.height;
      }
      if (frameSize.width > screenSize.width)
      {
        frameSize.width = screenSize.width;
      }
      frame.setLocation((screenSize.width - frameSize.width)/2, (screenSize.height - frameSize.height)/2);
      frame.show();
      frame.updateBar.setMaximum(fileSize);
      final int MAX = fileSize;
      InputStream in = new URL(fileToDownload).openConnection().getInputStream();
      FileOutputStream out = new FileOutputStream(new File(fileToSave));
      int count;
      byte buf[] = new byte[MAX];
      int bytesDownloadet=0;
      while ((count = in.read(buf,0,MAX)) != -1)
      {
        out.write(buf,0,count);
        bytesDownloadet++;
        frame.updateBar.setValue(bytesDownloadet);
        frame.downStat.setText("Downloading "+bytesDownloadet+"kb of "+fileSize+"kb");
      }
      out.close();
      in.close();
      frame.okButton.setEnabled(true);
    }
    catch(Exception e)
    {
      System.out.println(e);
    }
  }

Problemet ligger i min "bytesDownloadet"..
Den tæller op hvor mange kb der er downloadet indtil videre men rammer ved siden af hver gang.
eksempel:
hvis jeg downloader en fil på 4000kb så tæller den kun op til 2911

hvis jeg downloader en fil på 3000kb så tæller den kun op til 2212

Den rammer ca. 25% ved siden af hver gang...Hvad kan dette skyldes??

Mvh Casualty
Avatar billede arne_v Ekspert
29. januar 2003 - 12:35 #1
Øh.

Skulle du ikke bruge:

bytesDownloadet += count;

i.s.f.:

bytesDownloadet++;
Avatar billede arne_v Ekspert
29. januar 2003 - 12:39 #2
Det passer iøvrigt meget godt.

4000 KB fil / pakke-størrelse på knap 1500 byte = knap 3000 læsninger
Avatar billede webster Nybegynder
29. januar 2003 - 12:40 #3
Når du forsøger at læse data via read(byte[] b, int off, int len) så er der ikke nogen garanti for at der læses det antal byte som angivet ved len. Prøv med noget lignende:

while ((count = in.read(buf,0,MAX)) != -1)
      {
        out.write(buf,0,count);
        bytesDownloadet+= count;
        frame.updateBar.setValue(bytesDownloadet/1024);
        frame.downStat.setText("Downloading "+(bytesDownloadet/1024)+"kb of "+fileSize+"kb");
      }

evt skal bytesdownloadet være en anden datatype afhængig af hvor store filer du vil kunne hente.
Avatar billede casualty Nybegynder
29. januar 2003 - 12:46 #4
Oki..Kigger lige på det
Avatar billede arne_v Ekspert
29. januar 2003 - 12:46 #5
fileSize er forhåbentligt i B og ikke i KB så enten:

      int bytesDownloadet=0;
      while ((count = in.read(buf,0,MAX)) != -1)
      {
        out.write(buf,0,count);
        bytesDownloadet += count;
        frame.updateBar.setValue(bytesDownloadet);
        frame.downStat.setText("Downloading "+bytesDownloadet+"byte  of "+fileSize+" byte");
      }
     
eller:

      int bytesDownloadet=0;
      while ((count = in.read(buf,0,MAX)) != -1)
      {
        out.write(buf,0,count);
        bytesDownloadet += count;
        frame.updateBar.setValue(bytesDownloadet);
        frame.downStat.setText("Downloading "+bytesDownloadet/1024+"KB  of "+fileSize/1024+" KB");
      }
Avatar billede casualty Nybegynder
29. januar 2003 - 13:03 #6
Ok det virker..Jeg kan godt se hvad jeg havde gjort galt, jeg skulle selvfølgelig bruge bytesDownloadet+= count/1000 for at få kb...

Er der nogensomhelst måde at finde ud af hvad filstørrelsen er inden man henter filen?
Avatar billede casualty Nybegynder
29. januar 2003 - 13:07 #7
Fandt selv ud af det...Brugte:

int i=new URL(fileToDownload).openConnection().getContentLength();

Webster>>Lægger du ikke også et svar så i begge kan få points?
Avatar billede arne_v Ekspert
29. januar 2003 - 13:23 #8
Hvis du bruger:
  bytesDownloadet+= count/1000
tror jeg også du skal bruge:
  frame.updateBar.setMaximum(fileSize/1000);
Avatar billede arne_v Ekspert
29. januar 2003 - 13:27 #9
Og check resultatet af getContentLength. API DOC siger:

#public int getContentLength()
#Returns the value of the content-length header field.
#
#Returns:
#the content length of the resource that this connection's URL references,
#or -1 if the content length is not known.
Avatar billede webster Nybegynder
29. januar 2003 - 15:39 #10
arne kom først med det rigtige svar så lad ham få pointne =)
Avatar billede casualty Nybegynder
29. januar 2003 - 17:33 #11
Du er ædel...

Tak for svarene begge to...

Mvh Casualty
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester