Dateien verschieben
Dateien über Java zu verschieben ist relativ einfach, nämlich zum Beispiel so:
try {
File quellDatei = new File("/meine/quelledatei.txt");
File zielDatei = new File("/meine/zieldatei.txt");
quellDatei.renameTo(zielDatei);
} catch (Exception e) {
e.printStackTrace();
}
_______________________________
Dateien kopieren
Anders schaut es mit Kopieren von Dateien in andere Ordner aus. Hier hat man zwar mehrere Möglichkeiten der Umsetzung, es ist aber auch mit mehr Schreibaufwand verbunden.
Byteweise Einlesen macht in den wenigsten fällen Sinn, es kommt meistens ein Buffer zum Einsatz.
Ein Beispiel findet man hier: http://www.tutorials.de/forum/java/153779-dateien-kopieren.html
Eine performantere Lösung wäre natürlich über System.exec(…) Batch-Befehle per Java abzusetzen, man verspielt dabei aber den Vorteil der Plattformunabhängigkeit.
Eine echte Alternative zu Batch bieten die java.nio Klassen. Kopierprozesse per NIO über
transfer(inputChannel, outputChannel,...)
kann vom Betriebssystem (falls es das unterstützt) noch intern optimiert werden und kommen damit sehr nah an die Geschwindigkeit von Batchverarbeitung ran.
Hier ein Beispiel einer universellen FileCopy Klasse:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.ByteChannel;
import java.nio.channels.FileChannel;
public class FileCopy {
long chunckSizeInBytes;
boolean verbose;
public FileCopy(){
this.chunckSizeInBytes = 1024 * 1024; //Standard: Buffer 1MB
this.verbose = false; //Statistics about Copy Process
}
public FileCopy(boolean verbose){
this.chunckSizeInBytes = 1024 * 1024; //Standard: Buffer 1MB
this.verbose = verbose; //Statistics about Copy Process
}
public FileCopy(long chunckSizeInBytes){
this.chunckSizeInBytes = chunckSizeInBytes; //Custom Buffer (Bytes)
this.verbose = false; //Statistics about Copy Process
}
public FileCopy(long chunckSizeInBytes, boolean verbose){
this.chunckSizeInBytes = chunckSizeInBytes; //Custom Buffer (Bytes)
this.verbose = verbose; //Statistics about Copy Process
}
public void copy(File source, File destination) {
try {
FileInputStream fileInputStream = new FileInputStream(source);
FileOutputStream fileOutputStream = new FileOutputStream(destination);
FileChannel inputChannel = fileInputStream.getChannel();
FileChannel outputChannel = fileOutputStream.getChannel();
transfer(inputChannel, outputChannel, source.length(), false);
fileInputStream.close();
fileOutputStream.close();
destination.setLastModified(source.lastModified());
} catch (Exception e) {
e.printStackTrace();
}
}
public void transfer(FileChannel fileChannel, ByteChannel byteChannel, long lengthInBytes, boolean verbose)
throws IOException {
long overallBytesTransfered = 0L;
long time = -System.currentTimeMillis();
while (overallBytesTransfered < lengthInBytes) {
long bytesTransfered = 0L;
bytesTransfered = fileChannel.transferTo(overallBytesTransfered, Math.min(chunckSizeInBytes, lengthInBytes - overallBytesTransfered), byteChannel);
overallBytesTransfered += bytesTransfered;
if (verbose) {
System.out.println("overall bytes transfered: " + overallBytesTransfered + " progress " + (Math.round(overallBytesTransfered / ((double) lengthInBytes) * 100.0)) + "%");
}
}
time += System.currentTimeMillis();
if (verbose) {
System.out.println("Transfered: " + overallBytesTransfered + " bytes in: " + (time / 1000) + " s -> " + (overallBytesTransfered / 1024.0) / (time / 1000.0) + " kbytes/s");
}
}
}
Zu beachten ist dabei, dass der Zielordner schon zur Laufzeit bestehen muss beziehungsweise vorher erstellt wird.
Das NIO Beispiel stammt von folgender Seite:
http://www.tutorials.de/forum/java/328830-schnell-grosse-dateien-kopieren-mit-java-nio.html
Es wurde allerdings noch etwas umgeschrieben, dass es als universelle Klasse dient. Außerdem wurde ein Fehler in der Bufferbearbeitung behoben, daher ist von der Verwendung des Originals abzuraten.
Um ein Objekt nur einmal zu instanzieren und von jeder Klasse auf das gleiche Objekt zuzugreifen, wird SingleTon genutzt.
Die Problemlösung ist einfach und sauber. Um ein Objekt nur einmal zu instanzieren, wird geprüft ob das Objekt bereits instanziert wurde und falls es bereits instanziert wurde, wird das Objekt zurück gegeben. Falls das Projekt noch nicht instanziert wurde, wird ein neues Objekt angelegt.
Folgendes Codebeispiel liefert in verschiedenen Klassen immer das gleiche Objekt zurück:
20 Feb
Heute, den 20.02.2009 ist ein neuer Zero-Day-Exploit erschienen, welcher durch präperieren einer PDF Datei eine Sicherheitslücke im Adobe Reader, so wie im Adobe Acrobat ausnutzt. Durch das bearbeiten des Javacodes in der PDF ist es dem Angreifer möglich Schadsoftware auf den PC zu laden. Ein Patch hierfür gibt es nicht und wird auch erst mit der Version 9, welche am 11. März ausgerollt wird, erscheinen. Um dennoch sicher zu gehen, dass man nicht in ein Fettnäpchen fällt und sich mit einem Virus inifiziert, muss eine kleine Konfiguration zur deaktivierug von Javascript vorgenommen werden. Diese findet man unter Bearbeiten -> Grundeinstellungen -> JavaScript. Dort ist das Häkchen “Acrobat JavaScript aktivieren” zu entfernen. Danach sollte es hierfür keine Sicherheitsprobleme mehr geben. Einige viren hersteller erkennen den Exploit bereits als “Trojan.Pidief”.
15 Feb
Debian hat nach 2 Jahren endlich eine neue Version von Debian auf den Markt gebracht. Die auf den Namen Lenny hörende Distribution hat nebst aktuellerer Software, so wie den aktuellen 2.6.26 Kernel ein wesentlich verbesserten Desktop mitgeliefert und bietet ebenso ein grafisches Konfigurationswerkzeug. Die Installation von Debian 5.0 erkennt nun ein vielfaches mehr an aktueller Hardware, leider fehlt immer noch nötige W-Lan Treiber. Mehr…
15 Feb
Der Unix Timestamp erreicht
.
Dies ist nicht nur ein besonderes ereigniss für alle IT-begeisterten, sondern auch für Google, welche kurzerhand ein Logo mit dem Timestamp erstellt haben. Mehr…
5 Feb
Am 7. und 8. Februar werden mehr als fünftausend Entwickler der Freien und OpenSource Software Szene auf dem Solbosch-Campus der Freien Universität Brüssel zum 9. Free and Open Source Developer European Meeting erwartet. FOSDEM ‘09 ist kostenlos und nichtkommerziell, wird von der OpenSourceCommunity für die Community organisiert und soll Entwicklern die Möglichkeit geben, sich kennenzulernen und auszutauschen.
5 Feb
Wget ist das Programm mit dem ich zum ersten Mal die Macht der Kommandozeile kennengelernt habe. Für ein Projekt brauchte ich viele Bilder, um genau zu sein mehrere Tausend Bilder.
Über die Sammlung der Public-Domain-Bilderquellen der Wikipedia bin ich auf die NASA-Bilder-Sammlung aufmerksam geworden, die Public Domain ist. Es ist nicht schwierig herauszufinden, dass sich alle Bilder im Ordner http://grin.hq.nasa.gov/IMAGES/ befinden.
Ein wohl sehr interessantes Codierschema bietet die DCF77 Codierung. Bei dieser Codierung handelt es sich um eine BCD-Code Codierung. Die Daten werden über die Normalfrequenz von 77,5 kHz gesendet und beträgt etwa 30 kW bei einer Reichweite von etwa 2000km im Umkreis von Frankfurt/Main.
DCF77 steht hierbei für Mehr…
Viel zu oft wird die Frage “Wie lösche ich ein Verzeichnis rekursiv?” mit einem 100-Zeilen Skript beantwortet. Schade eigentlich, denn viele Programmierer haben sich immer noch keine Mühe gemacht die Änderungen von PHP5 wahrzunehmen. Mehr…
1 Feb
Java wird prinzipiel in einer Sandbox im Web ausgeliefert, um Schadcode zu unterdrücken. Leider ist diese Sandbox manchmal sehr unpraktisch, wenn es zum Beispiel darum geht Files über ein Applet zu laden und auszuführen. Ebenso ist es sehr wichtig die Sandbox zu umgehen, falls man Netzwerkanwendungen erstellen will, welche über den aufgerufenen Webhost hinaus gehen. Mehr…