# ProgressBar auf BufferedOutput- & -InputStream



## zubi (30. Apr 2004)

Hallo,

ich möchte für den FileTransfer zwischen zwei Clients je einen ProgressBar anzeigen lassen. Um den aktuellen wert des Bars festzulegen, lese ich beim Sender den OutputStream aus, d.h., ich addiere alle geschriebenen ints auf, und übergeben dann den Wert:

```
socket = new Socket(address, port);
BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
BufferedOutputStream outFile = new BufferedOutputStream(socket.getOutputStream());
int i;
while ((i = in.read()) != -1) {
     outFile.write(i);

     progressFile.updateBar(size += i);
}
```

Beim Empfänger sieht's genau so aus, nur lese ich hier den InputStream aus:

```
BufferedOutputStream outFile = new BufferedOutputStream(new FileOutputStream(file));
BufferedInputStream inStream = new BufferedInputStream(socket.getInputStream());
int i;
while ((i = inStream.read()) != -1) {
     outFile.write(i);
     progressFile.updateBar(size += i);
}
```

Das Problem liegt bei der Anzeige: egal wie gross die gesendete Datei ist: der ProgressBar geht viel zu schnell hoch und stimmt mit der Übertragung nicht überein.

Weiss jemand woran das liegen könnte?

Danke & Gruss
zubi


----------



## Roar (30. Apr 2004)

ne das kann so ja nicht gehen...
int i ist der *wert* der übertragen wird, also kannst du den wert nicht auf die progressBar raufaddieren.
ich würde es folgendermaßen machen:
1. die länge der datei in bytes auslesen ( File#length() )
2. die länge ganz am anfang des outputStreams scheriben, damit der empfänger weiß wie viel bytes er empfangen muss.
3. die übergibst der ProgressBar die anzahl der bytes als maximalwert, und bei jedem geschrieenem byte addierst du 1 auf die progressBar.
beim empfänger:
1. das erste byte was er empfängt muss dann die anzahl der zu empfangenden folgenden bytes sein. die übergibt er wieder an seine progressBar, und für jeden gelesenen byte wird die progressBar um 1 inkrementiert.


----------



## zubi (30. Apr 2004)

jo stimmt, mein überlegungsfehler.
die grösse hab' ich bereits mit length() übertragen, wenn ich jetzt noch inkrementiere funktioniert die sache!

herzlichen dank!

gruss,
zubi


----------

