Klonen und Kopieren von Dateien

Status
Nicht offen für weitere Antworten.

klein-odd

Aktives Mitglied
Hallo !
Ich brauche in einem Java Programm Dateien zu kopieren.

Angenommen heisst die Ausgangsdatei "source.txt"
und die Kopie "destination.txt".

Das Patent vom Java Tutorial von SUN mit der Kopplung
eines FileWriters an einen FileReader

arbeitet ungefähr so :

Java:
File source = new File("source.txt");
File destination = new File("destination.txt");

FileReader fread = new FileReader(source);
FileWriter fwrit = new FileWriter(destination);

int c;
while((c = fread.read())!=-1)
{
	fwrit.write(c);
}
fread.close();
fwrit.close();´

Dies ist gut für Character-Files, wie .txt, .html und ähnliche.

Schon Bilddateien, wie .gif, geschweige .pdf, lassen sich nicht so kopieren.
Es gibt schwer zu beschreibende Nebeneffekte, ausser einem,
dass .pdf Blätter nach dem Kopieren jungfernsauber aussehen.

Ich wollte die Effizienz des Kopierens von Windows oder sonst Systeme erreichen.

Kann jemand einen Lösungsweg vorschlagen oder auf fertige Lösung hinweis geben ?

Ich bin dankbar schon fürs Lesen
 
Zuletzt bearbeitet von einem Moderator:

Schandro

Top Contributor
ich denke mal das sollte funktionieren, wenn man einfach nur mit FileInput bzw. OutputStreams arbeitet.
€dit:
Java:
import java.io.*;

class A{

    public static void main(String[] args){
        try{
            FileInputStream in = new FileInputStream(new File("C://datei.gif"));
            FileOutputStream out = new FileOutputStream(new File("C://datei COPY.gif"));

            int next = 0;
            while((next = in.read()) != -1){
                out.write(next);
            }

            in.close();
            out.close();

        }catch(Exception e){e.printStackTrace();}
    }
}

Jep, funktioniert ;)
 
Zuletzt bearbeitet:
Wow, der Ursprung ist ja schon etwas älter... aber weil ihr hier grad geantwortet habt, häng ich mich mal mit rein, passt nämlich super zu der Frage, die ich habe:

Die Technik beim kopieren/verschieben ist klar, da hab ich keine Sorgen. Aber wenn ich mir die Performance anschaue ist's schon etwas grausig. Ich komme auf ca. 30-50% der Durchsatzraten von anderen Programmen, die eine Dateikopie anfertigen, bspw. der Windows eigene Explorer. Natürlich kopiere ich nicht jedes Zeichen/Byte einzeln, da müsste m.E. viel zu viel Overhead erzeugen, ich arbeite bei grösseren Dateien mit Blöcken von 500.000 Byte (MAX_BUF). Da sollte der zusätzliche Overhead aus der Schleife nicht mehr sooooo signifikant sein:


Java:
	public static long copyFile( File source, File destin, boolean append, StateDisplay display ) throws FileNotFoundException, IOException {
		FileInputStream reader;
		FileOutputStream writer;
		byte[] buf;
		int len;
		long res = 0;
		
		if ( source.isDirectory() || destin.isDirectory() )
			return -1;
		display.setDetailProgressInfoWithTextProgress( source.length(), 0, source.getName() );
		len = (int) Math.min( source.length() + 1, MAX_BUF );
		buf = new byte[ len ];
		reader = new FileInputStream( source );
		writer = new FileOutputStream( destin, append );
		len = reader.read( buf );
		while ( len > -1 ) {
			writer.write( buf, 0, len );
			display.addDiskTransfer( len );
			res += len;
			len = reader.read( buf );
			display.setDetailProgressInfoWithTextProgress( -1, res, source.getName() );
		}
		display.setDetailProgressInfo( res );
		reader.close();
		writer.close();
		
		return res;
	}

Irgendjemand eine Idee, wie ich an die Schreib/Lesegeschwindigkeiten vom System herankommen kann? Oder sollte man in dem Fall evt. Low-Level Funktionen nutzen? Da habe ich aber vermutlich keine Fortschrittskontrolle, oder?

Danke schonmal!
Stephan
 
Ok, hab da mal einen kleinen Test gefahren:

Java:
2009-04-16 09:13:37,598 ###### Test ###### Performance test for standard internal method
2009-04-16 09:13:45,567 Time before start: 16.04.2009 09:13 (Donnerstag)
2009-04-16 09:13:45,567 Time after copy:   16.04.2009 09:13 (Donnerstag)
2009-04-16 09:13:45,567 Bytes copied: 100.000.000 duration: 7 throughput: 14285714
2009-04-16 09:13:45,567 ###### Test ###### Performance test for new java IO methods
2009-04-16 09:13:49,614 Time before start: 16.04.2009 09:13 (Donnerstag)
2009-04-16 09:13:49,614 Time after copy:   16.04.2009 09:13 (Donnerstag)
2009-04-16 09:13:49,614 Bytes copied: 100.000.000 duration: 4 throughput: 25000000

Java:
2009-04-16 09:17:07,895 < finished test of initialized base dir for JUnit test runs.
2009-04-16 09:17:07,895 ###### Test ###### Performance test for standard internal method
2009-04-16 09:18:34,239 Time before start: 09:17:07
2009-04-16 09:18:34,239 Time after copy:   09:18:34
2009-04-16 09:18:34,239 Bytes copied: 1.000.000.000 duration: 86 throughput: 11627906
2009-04-16 09:18:34,255 ###### Test ###### Performance test for new java IO methods
2009-04-16 09:20:34,317 Time before start: 09:18:34
2009-04-16 09:20:34,411 Time after copy:   09:20:34
2009-04-16 09:20:34,426 Bytes copied: 1.000.000.000 duration: 119 throughput: 8403361

Ausserdem hab ich in der Doku folgendes gelesen:
For most operating systems, mapping a file into memory is more expensive than reading or writing a few tens of kilobytes of data via the usual read and write methods. From the standpoint of performance it is generally only worth mapping relatively large files into memory.

Nun geht es mir ja - gerade bei großen Files - speziell um eine bessere Performance. Hiernach stelle ich vorerst fest, dass nio keinen Gewinn bringt.

Dazu kommt, dass ich bei den "standard" Methoden den Puffer mehrfach verwenden kann, ich denke das ist bei großen Datenmengen der Grund, warum die Performance von NIO hinkt? Kann ich aber nur raten. D.h. aber auch, dass ich die Datei nur in einem großen Brocken kopieren kann, d.h. ich habe keine Fortschrittskontrolle. Zumindest hab ich da noch (jetzt auf die Schnelle) keine Möglichkeit gefunden, ist das korrekt?

Kleine Ergänzung: Jetzt hab ich noch eine dritte Routine getestet, die arbeitet mit BufferedInput(Output)Stream. Letztlich alles gleich am Ende, mal ein paar Millisekunden, aber die größte Abweichung kommt noch durch Rundungen... Größe Testfile war jetzt 100M, denke das sollte für den Durchsatztest reichen, aber auch bei 1G ist es für die NIO eher ungünstig.

Noch jemand irgendwelche Ideen?

Stephan
 
Zuletzt bearbeitet:
Java:
2009-04-16 10:10:04,661 ###### Test ###### Performance test for standard internal method
2009-04-16 10:10:08,989 Time before start: 10:10:04
2009-04-16 10:10:09,036 Time after copy:   10:10:08
2009-04-16 10:10:09,067 Bytes copied: 100000000 duration: 4 throughput: 25000000
2009-04-16 10:10:09,114 ###### Test ###### Performance test for new java IO methods
2009-04-16 10:10:13,864 Time before start: 10:10:09
2009-04-16 10:10:13,926 Time after copy:   10:10:13
2009-04-16 10:10:13,989 Bytes copied: 100000000 duration: 4 throughput: 25000000
2009-04-16 10:10:14,067 ###### Test ###### Performance test for buffered stream methods
2009-04-16 10:10:18,848 Time before start: 10:10:14
2009-04-16 10:10:18,911 Time after copy:   10:10:18
2009-04-16 10:10:18,958 Bytes copied: 100000000 duration: 4 throughput: 25000000
2009-04-16 10:10:19,036 ###### Test ###### Delete the files from performance tests
2009-04-16 10:10:19,098 Deleting 3 files now!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Welt in GameOfLife klonen Java Basics - Anfänger-Themen 9
S Objekte klonen und Deep Copy Java Basics - Anfänger-Themen 30
D komplexe Datenstrukturen "klonen" Java Basics - Anfänger-Themen 4
M Methoden Array unbedingt klonen? und Point Frage. Java Basics - Anfänger-Themen 4
M Variablen return-array klonen Java Basics - Anfänger-Themen 3
P Tiefes Klonen Java Basics - Anfänger-Themen 2
U ArrayList Klonen Java Basics - Anfänger-Themen 15
W Java Fenster durch Buttonclick klonen Java Basics - Anfänger-Themen 4
B OOP Objekt klonen (Grundzustand), um in Editor "Abbrechen" zu können Java Basics - Anfänger-Themen 4
0 JComponent klonen? Java Basics - Anfänger-Themen 13
B JPanel klonen Java Basics - Anfänger-Themen 13
B LinkedList klonen Java Basics - Anfänger-Themen 8
T Fehlermeldung beim Klonen eines JPanels Java Basics - Anfänger-Themen 8
M ResultSet klonen Java Basics - Anfänger-Themen 6
S Objekt klonen mit clone() Java Basics - Anfänger-Themen 3
G variable kopieren bzw. woanders benutzen Java Basics - Anfänger-Themen 6
B Objekt kopieren und sämtliche Referenzen von diesem Objekt? Java Basics - Anfänger-Themen 3
S Objekt aus Arraylist in andere Arraylist kopieren? Java Basics - Anfänger-Themen 2
J Array; Elemente kopieren Java Basics - Anfänger-Themen 17
S Eine Liste kopieren Java Basics - Anfänger-Themen 13
M ArrayList - Objekt kopieren und ändern Java Basics - Anfänger-Themen 11
A BinaryTree komplett kopieren Java Basics - Anfänger-Themen 7
M Arrays in Funktion Kopieren und Bearbeiten Java Basics - Anfänger-Themen 4
J Zweidimensionales array kopieren und in eindimensionales überführen Java Basics - Anfänger-Themen 304
F Input/Output Files von A nach B kopieren Java Basics - Anfänger-Themen 11
S Image Datei selektieren und in Projekt Verzeichnis abspeichern/kopieren Java Basics - Anfänger-Themen 16
S Input/Output Vom Netzwerk kopieren Java Basics - Anfänger-Themen 6
M Mehre Dateien parallel kopieren mit Multithreading Java Basics - Anfänger-Themen 8
C Objekt (tief)-kopieren Java Basics - Anfänger-Themen 2
M Input/Output Word File Kopieren Java Basics - Anfänger-Themen 12
TomatenBrot447 Wie kann man ein Objekt kopieren? Java Basics - Anfänger-Themen 11
W Datentypen Kopieren von Arrays Java Basics - Anfänger-Themen 4
M Input/Output Datei in Laufzeit-JAR kopieren Java Basics - Anfänger-Themen 6
D Input/Output Ordner aus .Jar in das Verzeichnis der .Jar kopieren Java Basics - Anfänger-Themen 1
B Dateien aus dem "resource" - Folder kopieren in Verzeichnis Java Basics - Anfänger-Themen 9
B Kopieren von Dateien mit Adminberechtigungen Java Basics - Anfänger-Themen 14
D 2 D Arrays kopieren Java Basics - Anfänger-Themen 3
S double[x] , double[y] zu Point[] points kopieren? Java Basics - Anfänger-Themen 15
C Array kopieren und nur bestimmte Werte speichern Java Basics - Anfänger-Themen 6
D Bestimmte Werte von Objekten aus einer ArrayList in eine andere ArrayList kopieren Java Basics - Anfänger-Themen 14
C Datei identisch Kopieren Java Basics - Anfänger-Themen 3
E Textdatei kopieren funktioniert nicht Java Basics - Anfänger-Themen 12
L Source Code in Editor kopieren Java Basics - Anfänger-Themen 5
S ods-Dateo kopieren Java Basics - Anfänger-Themen 12
M Threads nio Dateien kopieren, Threads und Gui Java Basics - Anfänger-Themen 0
S Binärbaum kopieren Java Basics - Anfänger-Themen 6
J Klassen Fehler Datei kopieren - was mache ich falsch Java Basics - Anfänger-Themen 19
M Kopieren einer .wav Datei Java Basics - Anfänger-Themen 6
J Dienst zum Text kopieren und Variable hochzählen Java Basics - Anfänger-Themen 7
V Zwei Array in einem kopieren Java Basics - Anfänger-Themen 3
T TreeSet sortiert in ein anderes kopieren Java Basics - Anfänger-Themen 2
B Methode zum kopieren von Arrays Java Basics - Anfänger-Themen 9
C Referenz auf ein Objekt kopieren! Java Basics - Anfänger-Themen 2
J Text kopieren an bestimmter Stelle Java Basics - Anfänger-Themen 8
T ArrayList kopieren Java Basics - Anfänger-Themen 10
M Java-Datei in Ordner Kopieren Java Basics - Anfänger-Themen 12
S Dateien in RAM kopieren und ausführen? Java Basics - Anfänger-Themen 4
B Dateien kopieren, entpacken, XML auslesen! Java Basics - Anfänger-Themen 7
M Array Inhalt kopieren Java Basics - Anfänger-Themen 3
D Mehrere Datein kopieren Java Basics - Anfänger-Themen 10
H Interface JTextPane html formatiert kopieren Java Basics - Anfänger-Themen 2
Dogge Datei kopieren Java Basics - Anfänger-Themen 13
F Kopieren von Ordner sammt inhalt Java Basics - Anfänger-Themen 5
S Dateien mittels Path(s) kopieren und umbenennen. Java Basics - Anfänger-Themen 4
C Erste Schritte Integer Werte in Array kopieren Java Basics - Anfänger-Themen 21
R Datei kopieren: Performance erhöhen Java Basics - Anfänger-Themen 10
B Erste Schritte Dateien ueber Netzwerk kopieren Java Basics - Anfänger-Themen 2
G Nur benötigte Klassen in executable jar kopieren! Java Basics - Anfänger-Themen 6
S File Kopieren Path Pfad Problem Java Basics - Anfänger-Themen 3
T Methoden Array kopieren: Wie geht das? Java Basics - Anfänger-Themen 20
R Kopieren einer Datei Java Basics - Anfänger-Themen 18
G Kopieren von Array-Daten Java Basics - Anfänger-Themen 6
A Datein kopieren: File oder xcopy? Was ist schneller? Java Basics - Anfänger-Themen 10
L Datei kopieren Java Basics - Anfänger-Themen 11
F Text aus Textfeld1 in Textfeld 2 kopieren Java Basics - Anfänger-Themen 5
N IndexOutOfBoundsException: Source does not fit in dest beim Kopieren von ArrayList in Vector Java Basics - Anfänger-Themen 4
eLogic Ordner kopieren/schreiben Java Basics - Anfänger-Themen 2
G Text aus TextArea in Zwischenablage kopieren Java Basics - Anfänger-Themen 6
J Jar kopieren und einfügen Java Basics - Anfänger-Themen 4
X Zeile in Tabelle kopieren und in andere einfügen Java Basics - Anfänger-Themen 6
N Kopieren einer ArrayListe Java Basics - Anfänger-Themen 3
D In Zwischenablage kopieren Java Basics - Anfänger-Themen 8
C Datei kopieren - Erweiterung java.io.File Java Basics - Anfänger-Themen 2
S datein kopieren Java Basics - Anfänger-Themen 5
N Vectorinhalt kopieren Java Basics - Anfänger-Themen 4
K Datentypen Bestimmten Part aus String kopieren mit RegEx Java Basics - Anfänger-Themen 4
B .class datei kopieren und auführen Java Basics - Anfänger-Themen 8
C Bilder von Server zu Server kopieren über Webdav(Sardine) Java Basics - Anfänger-Themen 5
F Object kopieren in GWT Java Basics - Anfänger-Themen 2
D HashMap mit Inhalt kopieren Java Basics - Anfänger-Themen 8
S element in Array kopieren Java Basics - Anfänger-Themen 12
N Mac - Java Code aus dem Forum kopieren Java Basics - Anfänger-Themen 12
S Array im Konstruktor kopieren Java Basics - Anfänger-Themen 8
D Referenztyp kopieren nicht refenenzieren ?! Java Basics - Anfänger-Themen 4
A 2 arrays zu einem Kopieren Java Basics - Anfänger-Themen 2
H Datei kopieren per Eingabe Java Basics - Anfänger-Themen 11
G Array kopieren Java Basics - Anfänger-Themen 4
F Verschachtelte Arrays kopieren und überschreiben Java Basics - Anfänger-Themen 4
S JLabel clonen/kopieren Java Basics - Anfänger-Themen 2
F Verzeichnisse und Dateien kopieren Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben