# Datei performant im Netzwerk verschieben



## Guest (23. Jul 2008)

Hallo,

wie verschiebe ich performant eine Datei in Java?
Ich habe es aktuell so gemacht:

```
public synchronized boolean moveFile(String filename, String targetDirectory) {
        File file = new File(filename);
        File dir = new File(targetDirectory);
        return file.renameTo(new File(dir, file.getName()));
    }
```

Das "synchronized" benötige ich, da es in einer Multithreaded-Umgegebung abläuft.

So nun funktioniert das auch ganz gut und performant, wenn die Applikation und die Verzeichnisse auf dem selben Rechner liegen.
Sind die Verzeichnisse aber auf einem anderen Rechner und es wird über das Netzwerk (Windows) darauf zugegriffen, bricht die Performanz massiv ein.

Daraufhin habe ich versucht obigen Move mit Java.nio zu machen:

```
public synchronized boolean transferFile(File srcFile, File destFile) throws IOException {
        boolean bRet = false;
        FileChannel srcChannel = null;
        FileChannel destChannel = null;
        try {
            srcChannel = new FileInputStream(srcFile).getChannel();
            destChannel = new FileOutputStream(destFile).getChannel();
            destChannel.transferFrom(srcChannel, 0, srcChannel.size());
            srcFile.delete();
            bRet = true;
        } catch (IOException ex) {
            Logger.getLogger(FileHelper.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            if (srcChannel != null) {
                srcChannel.close();
            }
            if (destChannel != null) {
                destChannel.close();
            }
        }

        return bRet;
    }
```
Aber das brachte keine Besserung.

Nun:
Wie kann ich das Performanzproblem (bei Zugriffen über Netzwerkfreigaben) lösen?

Viele Grüsse
Thomas


----------



## madboy (23. Jul 2008)

Anonymous hat gesagt.:
			
		

> So nun funktioniert das auch ganz gut und performant, wenn die Applikation und die Verzeichnisse auf dem selben Rechner liegen.
> Sind die Verzeichnisse aber auf einem anderen Rechner und es wird über das Netzwerk (Windows) darauf zugegriffen, bricht die Performanz massiv ein.


Meinst du das ernst? Ich meine, vergleichst du die Performance deiner Festplatte mit der eines Netzwerkes?
Schau am besten mal beim Datei verschieben mit deinem Programm in die Netzwerk-Auslastungsanzeige deines Betriebssystems. Bewegt sie sich im Bereich von 80-100% ist alles tip top und es gibt keinen Grund, irgendwas zu lösen (außer ein schnelleres Netzwerk anzuschaffen). Ansonsten entschuldige ich mich und lasse konstruktiveren Antwortern den Vortritt.


----------



## FArt (23. Jul 2008)

Hast du einen zeitlichen Vergleich bzgl. verschieben über das Betriebsystem (einfach copy oder move) und Java?

Annahme: das Netzwerk ist das Bottleneck, unabhängig von der Art und Weise...


----------



## tommeltom (23. Jul 2008)

Hallo,

ja den Durchsatz des Netzwerkes mit Lokal vergleich ich ganz bewußt, da es massivst einbrach.
So jetzt bin ich aber weiter und sag schonmal vorab: Sorry!

Es lag nicht am Move, sondern es war eine Verklemmung mehrerer Threads.
Nachdem ich diese gelöst bzw. das Thread-Zusammenspiel harmonisiert habe, ist der Durchsatz jetzt mehr als ok.

Auf den Move kam ich, da der Profiler diesen als ziemlichen Zeitfresser anzeigt bzw. Sun ja nicht umsonst NIO einführte und zumindest unter Windows gibt es da ein paar Performanzprobleme.

Trotzdem Danke für eure Rückmeldungen!

Viele Grüsse
Thomas


----------



## tuxedo (24. Jul 2008)

Das was du da machst, ist lediglich eine Datei im Dateisystem verschieben. Java sieht da nix von "Netzwerk". Das ist in deinem Fall OS Sache.

Das in Windows zugrunde liegende "Dateifreigabe" Dingenskirchens (weiß nicht ob man das jetzt CIFS oder SMB nennen kann/darf/soll) ist nicht gerade turbo performant. Okay, es ist nicht schlecht. Aber mit einem schlankeren Protokoll gehts nochmal nen ordentlichen Zacken schneller.

Wenn du also von "Datei performant im Netzwerk verschieben" sprichst, dann bau eine eigene Netzwerkanwendung die NIO und ein schlankes Protokoll benutzt. Erst dann hast du die Performance selbst in der Hand.

- Alex


----------

