# Dateidownload per FTP wird immer langsamer und bleibt dann stehen



## Milo (9. Mrz 2011)

Hallo,

ich möchte von einem Server Dateien runterladen. Ich nutze hierfür Apache Commons Net. Grundsätzlich funktioniert es auch aber wenn ich mehrere Dateien ziehen möchte, dann wird der Download langsamer und bleibt irgendwann stehen. Das langsamer könnte zwar auch Einbildung sein aber hängen bleibt er in jedem Fall. Mein Problem ist, dass ich nicht erkennen kann, warum er hängenbleibt. Ich bekomme keine Fehlermeldung oder einen anderen Hinweis. Die Methode downloadFile wird in einer Schleife permanent aufgerufen und soll Dateien lokal abspeichern. Es handelt sich hierbei um ca. 100-150 Dateien. Das Programm bleibt auch nicht immer an der selben Stelle stehen.


```
public File downloadFile(String local, String remote) {
	FileOutputStream fos = null;
	File file = null
	try {
		file = new File(local);
		FileOutputStream fos = new FileOutputStream(file);
		ftp.retrieveFile(remote, fos);
		fos.flush();
	} catch (IOException e) {
		e.printStackTrace();
	}	
	finally {
		if (fos != null) {
			try {
				fos.close();
			} catch (Exception e) {
				e.printStackTrace();
			}	
		}
	}
	return file;
}
```

Hatte jemand schon ein vergleichbares Problem? Welche Ursachen könnte es haben?

Bin für Anregungen dankbar!
Micha


----------



## FArt (10. Mrz 2011)

Theorie: die Datei ist mächtig groß, füllt den Speicher aus und die VM ist nur noch mit GC beschäftigt... das kann man alles messen... bau mal Logging ein und (Speicherverbrauch, Zeiten, geladene Datenme nge usw.) und analysiere das, damit das Gefühl auch belegt werden kann.


----------



## Milo (10. Mrz 2011)

Hallo FArt,

vielen Dank für Deinen Hinweis. Die Dateien sind alle klein (unter 1MB, zum Testen im Moment unter 100kb). Ich habe es nun auch via:


```
URL url = new URL("ftp://example.org/myfile");
InputStream in = url.openConnection().getInputStream();
```

probiert und auch hier bleibt das Programm nach x Downloads einfach stehen, wobei x nicht immer die selbe Dateianzahl ist. Ich erreicht so ca. 150/200 Downloads.

Der Aufruf erfolgt dabei analog zum gestern beschriebenen in einer Schleife:

```
for ( Map.Entry<String, FTPFile> e : fileList.entrySet() ) {
	String newFileName = e.getKey();
	FTPFile ftpFile    = e.getValue();
				
	if (!localFileList.containsKey(newFileName) || 
			(localFileList.get(newFileName).length() < ftpFile.getSize()) ) {
					
		System.out.println("Download " + ftpFile.getName());
		File file = ftp.downloadFileViaURL(this.destPath + newFileName, remoteServer.getPath() + ftpFile.getName());
		if (file != null && file.exists()) {
			if (!file.setLastModified(ftpFile.getTimestamp().getTimeInMillis())) {
				System.err.println("Fehler beim setzen von LAST-MODIFIFIED fuer File " + file.getName());
			}
		}
	}
```

Die Methode downloadFileViaURL sieht dann wie folgt aus:


```
public File downloadFileViaURL(String local, String remote) {
		File file = null;
		FileOutputStream out = null;
		InputStream in = null;
		try {
			URL url = new URL("ftp://" + this.uri + remote);
			
			//System.out.println(url);
			
			in = url.openConnection().getInputStream();
			file = new File(local);
	
			out = new FileOutputStream( file );
			
			int len;
			byte[] buffer = new byte[1024];

            while ((len = in.read(buffer)) != -1) {
                out.write(buffer, 0, len);
            }

			out.flush();
		} catch (Exception e) {
			e.printStackTrace();
		}
		finally {
			if (in != null) {
				try {
					in.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			if (out != null) {
				try {
					out.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
		return file;
	}
```

Mir würde ja auch eine Fehlermeldung/Exception schon reichen, um wenigstens die Chance zu haben, reagieren zu können aber es bleibt einfach stehen?!

Gruß Micha


----------



## Milo (10. Mrz 2011)

... Nachtrag: Ich habe gerade mal das setLastModified entfernt und nun scheint es zu laufen. Kann es wirklich daran liegen?


----------

