Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
16
ZUGRIFFE
12197
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
  1. #1
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    10.222
    Hallo,

    schaut mal hier:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    
    /**
     * 
     */
    package de.tutorials;
     
    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;
    import java.nio.channels.SocketChannel;
    import java.nio.channels.WritableByteChannel;
     
    /**
     * @author Tom
     * 
     */
    public class FastFileCopyExample {
     
        /**
         * @param args
         */
        public static void main(String[] args) {
            copy(file("D:/VMWare/40g xp development/xp-s005.vmdk"),
                    file("c:/temp/xp-s005.vmdk"));
        }
     
        private static File file(String path) {
            return new File(path);
        }
        
        public static 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(), 1024 * 1024 * 32 /* 32 MB */, true,true);
     
                fileInputStream.close();
                fileOutputStream.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
     
        public static void transfer(FileChannel fileChannel,
                ByteChannel byteChannel, long lengthInBytes,
                long chunckSizeInBytes, boolean verbose, boolean fromFile)
                throws IOException {
     
            long overallBytesTransfered = 0L;
            long time = -System.currentTimeMillis();
            while (overallBytesTransfered < lengthInBytes) {
     
                long bytesTransfered = 0L;
     
                if (fromFile) {
                    bytesTransfered = fileChannel.transferTo(0, Math.min(
                            chunckSizeInBytes, lengthInBytes
                                    - overallBytesTransfered), byteChannel);
                } else {
                    bytesTransfered = fileChannel.transferFrom(byteChannel,
                            overallBytesTransfered, Math.min(chunckSizeInBytes,
                                    lengthInBytes - overallBytesTransfered));
                }
     
                overallBytesTransfered += bytesTransfered;
     
                if (verbose) {
                    System.out.printf(
                            "overall bytes transfered: %s progress %s%%\n",
                            overallBytesTransfered, Math
                                    .round(overallBytesTransfered
                                            / ((double) lengthInBytes) * 100.0));
                }
     
            }
            time += System.currentTimeMillis();
     
            if (verbose) {
                System.out.printf("Transfered: %s bytes in: %s s -> %s kbytes/s",
                        overallBytesTransfered, time / 1000,
                        (overallBytesTransfered / 1024.0) / (time / 1000.0));
            }
     
        }
    }

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    
    overall bytes transfered: 33554432 progress 2%
    overall bytes transfered: 67108864 progress 3%
    overall bytes transfered: 100663296 progress 5%
    overall bytes transfered: 134217728 progress 6%
    overall bytes transfered: 167772160 progress 8%
    overall bytes transfered: 201326592 progress 9%
    overall bytes transfered: 234881024 progress 11%
    overall bytes transfered: 268435456 progress 13%
    overall bytes transfered: 301989888 progress 14%
    overall bytes transfered: 335544320 progress 16%
    overall bytes transfered: 369098752 progress 17%
    overall bytes transfered: 402653184 progress 19%
    overall bytes transfered: 436207616 progress 20%
    overall bytes transfered: 469762048 progress 22%
    overall bytes transfered: 503316480 progress 23%
    overall bytes transfered: 536870912 progress 25%
    overall bytes transfered: 570425344 progress 27%
    overall bytes transfered: 603979776 progress 28%
    overall bytes transfered: 637534208 progress 30%
    overall bytes transfered: 671088640 progress 31%
    overall bytes transfered: 704643072 progress 33%
    overall bytes transfered: 738197504 progress 34%
    overall bytes transfered: 771751936 progress 36%
    overall bytes transfered: 805306368 progress 38%
    overall bytes transfered: 838860800 progress 39%
    overall bytes transfered: 872415232 progress 41%
    overall bytes transfered: 905969664 progress 42%
    overall bytes transfered: 939524096 progress 44%
    overall bytes transfered: 973078528 progress 45%
    overall bytes transfered: 1006632960 progress 47%
    overall bytes transfered: 1040187392 progress 49%
    overall bytes transfered: 1073741824 progress 50%
    overall bytes transfered: 1107296256 progress 52%
    overall bytes transfered: 1140850688 progress 53%
    overall bytes transfered: 1174405120 progress 55%
    overall bytes transfered: 1207959552 progress 56%
    overall bytes transfered: 1241513984 progress 58%
    overall bytes transfered: 1275068416 progress 59%
    overall bytes transfered: 1308622848 progress 61%
    overall bytes transfered: 1342177280 progress 63%
    overall bytes transfered: 1375731712 progress 64%
    overall bytes transfered: 1409286144 progress 66%
    overall bytes transfered: 1442840576 progress 67%
    overall bytes transfered: 1476395008 progress 69%
    overall bytes transfered: 1509949440 progress 70%
    overall bytes transfered: 1543503872 progress 72%
    overall bytes transfered: 1577058304 progress 74%
    overall bytes transfered: 1610612736 progress 75%
    overall bytes transfered: 1644167168 progress 77%
    overall bytes transfered: 1677721600 progress 78%
    overall bytes transfered: 1711276032 progress 80%
    overall bytes transfered: 1744830464 progress 81%
    overall bytes transfered: 1778384896 progress 83%
    overall bytes transfered: 1811939328 progress 85%
    overall bytes transfered: 1845493760 progress 86%
    overall bytes transfered: 1879048192 progress 88%
    overall bytes transfered: 1912602624 progress 89%
    overall bytes transfered: 1946157056 progress 91%
    overall bytes transfered: 1979711488 progress 92%
    overall bytes transfered: 2013265920 progress 94%
    overall bytes transfered: 2046820352 progress 96%
    overall bytes transfered: 2080374784 progress 97%
    overall bytes transfered: 2113929216 progress 99%
    overall bytes transfered: 2143158272 progress 100%
    Transfered: 2143158272 bytes in: 33 s -> 62548.280087265775 kbytes/s

    Für das kopieren von 2 gb brauch ich damit nur 33 s.

    Gruß Tom
    00Stan und mccae bedanken sich. 
    Du kommst aus dem Saarland oder Umgebung? Du hast Interesse an Java-Technologie Themen? Then let's Meetup!

    Java rocks! http://www.jugsaar.de

    Does IT in Java and .Net
    Xing
    Twitter

  2. #2
    The_S Tutorials.de Gastzugang
    N bisschen viel Code für die Methode FileChannel.transferTo/transferFrom . Was evtl. in diesem Zusammenhang auch noch interessant ist: http://commons.apache.org/io/
     

  3. #3
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    10.222
    Hallo,

    N bisschen viel Code für die Methode FileChannel.transferTo/transferFrom
    Was soll denn das heißen? Wenn man eine Datei häppchenweise via FileChannel transferTo/From transportieren möchte bleibt einem nichts anderes übrig als diesen Code drum herum zu bauen.

    Kannst aber auch gerne mal versuchen eine 2gb datei mit fileChannel.transferTo driekt zu versenden :-P
    Vielleicht bekommst du das auch schneller hin

    Außerdem kann die Transfer Methode nicht nur von einem FileChannel lesen und in einen anderen ByteChannel reinschreiben sondern auch umgekehrt.

    Das "pseudo" logging dient nur zur Verdeutlichung...

    Was evtl. in diesem Zusammenhang auch noch interessant ist: http://commons.apache.org/io/
    CommonsIO ist mir wohl bekannt Dort wird in der Klasse FileUtils auch der FileChannel verwendet. Leider
    kann man damit aber nur Dateien kopieren die auch in den Speicher passen...

    Da meine Variante Blockweise kopiert gibts hier keine Größenbeschränkungen.

    Gruß Tom
     
    Du kommst aus dem Saarland oder Umgebung? Du hast Interesse an Java-Technologie Themen? Then let's Meetup!

    Java rocks! http://www.jugsaar.de

    Does IT in Java and .Net
    Xing
    Twitter

  4. #4
    The_S Tutorials.de Gastzugang
    Hehe, wollte doch nur ein bisschen stänkern .

    Die IO-Tools sollten nicht als Verbesserung von deinem Code verstanden werden, sondern als Ergänzung. Wer sich mit dem performanten Kopieren von Dateien beschäftigt, der sollte eben evtl. auch mal da einen Blick rein werfen.

    Schönes Wochenende!
     

  5. #5
    Avatar von takidoso
    takidoso ist offline Mitglied Brillant
    Registriert seit
    Aug 2004
    Ort
    Kömigstein
    Beiträge
    990
    Hallo Tom,
    ich habe Deine Routinen nch nicht ausprobiert, aber meine Frage ...ab welcher Java-Version funktioniert Dein Beispiel?

    mit neugierigem Gruß

    Takidoso
     

  6. #6
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    10.222
    Hallo,

    wenn man die System.out.printf calls in println umschreibt sollte das ganze auch unter 1.4 laufen.

    Gruß Tom
     
    Du kommst aus dem Saarland oder Umgebung? Du hast Interesse an Java-Technologie Themen? Then let's Meetup!

    Java rocks! http://www.jugsaar.de

    Does IT in Java and .Net
    Xing
    Twitter

  7. #7
    ph0e Tutorials.de Gastzugang
    Mh nur mal eine Frage, hast du die kopierten Dateien auch mal getestet? Weil wenn ich hab das mal mit zips probiert und war von dem speed direkt beeindruckt, aber die zips sind nur solange valid wie sie kleiner als ein chunk sind.
    Würde meinen aber dem 2. Chunk schreibt der da Bitmüll beim >Kopieren rein, was auch den speed erklären würde :P
     

  8. #8
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    10.222
    Hallo,

    in der alten transfer-Methode gabs einen Bug der hier diskutiert wurde:
    http://www.tutorials.de/forum/java/2...bertragen.html

    Gefixedte Version:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    
    package de.tutorials;
     
    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 FastFileCopyExample {
     
      /**
       * @param args
       */
      public static void main(String[] args) {
        copy(file("c:/foo.zip"), file("c:/foo-2.zip"));
      }
     
     
      private static File file(String path) {
        return new File(path);
      }
     
     
      public static 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(), 1024 * 1024 * 32 /* 32 MB */, true);
     
          fileInputStream.close();
          fileOutputStream.close();
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
     
     
      public static void transfer(FileChannel inputChannel, ByteChannel outputChannel, long lengthInBytes, long chunckSizeInBytes, boolean verbose) throws IOException {
        long overallBytesTransfered = 0L;
        long time = -System.currentTimeMillis();
        while (overallBytesTransfered < lengthInBytes) {
          long bytesToTransfer = Math.min(chunckSizeInBytes, lengthInBytes - overallBytesTransfered);
          long bytesTransfered = inputChannel.transferTo(overallBytesTransfered, bytesToTransfer, outputChannel);
     
          overallBytesTransfered += bytesTransfered;
     
          if (verbose) {
            long percentageOfOverallBytesTransfered = Math.round(overallBytesTransfered / ((double) lengthInBytes) * 100.0);
            System.out.printf("overall bytes transfered: %s progress %s%%\n", overallBytesTransfered, percentageOfOverallBytesTransfered);
          }
     
        }
        time += System.currentTimeMillis();
     
        if (verbose) {
          double kiloBytesPerSecond = (overallBytesTransfered / 1024.0) / (time / 1000.0);
          System.out.printf("Transfered: %s bytes in: %s s -> %s kbytes/s", overallBytesTransfered, time / 1000, kiloBytesPerSecond);
        }
     
      }
    }

    Gruß Tom
     
    Du kommst aus dem Saarland oder Umgebung? Du hast Interesse an Java-Technologie Themen? Then let's Meetup!

    Java rocks! http://www.jugsaar.de

    Does IT in Java and .Net
    Xing
    Twitter

  9. #9
    ph0e Tutorials.de Gastzugang
    Ah, ich hät ja auch mal meine Gehirn-Augen-Koordination besser benutzen können.
    Danke, ja so läuft die natürlich gut und richtig
     

  10. #10
    Anime-Otaku ist offline Mitglied Brillant
    Registriert seit
    Aug 2005
    Ort
    Karlsruhe (Baden-Württemberg)
    Beiträge
    906
    Was ich mich gerade Frage, wie bestimmt man die "richtige" Chunk size? Gibt es da eine Faustformel?
     
    Wäre super wenn ihr euren Code in dieser Form einfügt:
    Code java:
    1
    
    System.out.println("Hello World");
    [java]System.out.println("Hello World");[/java]
    Für erledigte Threads dürft ihr den "erledigt"-Button anklicken!
    Über Dank freut sich jeder, der euch geholfen hat - ein Klick auf "Danke" kostet ja nicht mal was
    Blog: http://javaeffective.wordpress.com/

  11. #11
    eStudy Tutorials.de Gastzugang
    Hallo Leute,

    das sind ja echt gute Tutorials aber wie kann ich denn mittels NIO Dateien übers Netzwerk mittels Channel kopieren? Da hänge ich irgendwie fest.
     

  12. #12
    gorefest ist offline Mitglied Brokat
    Registriert seit
    Apr 2009
    Beiträge
    324
    Zitat Zitat von eStudy Beitrag anzeigen
    Hallo Leute,

    das sind ja echt gute Tutorials aber wie kann ich denn mittels NIO Dateien übers Netzwerk mittels Channel kopieren? Da hänge ich irgendwie fest.
    Lösung 1 : Du könntest mit JSCh einen SSH-Tunnel aufbauen und java-scp machen. Nachteil : Hierzu benötigst Du einen SSH-Server und einen Account auf selbigem
    Lösung 2 : Du kannst mit JCIFS das Zeug auf einen netzwerk-Mountpoint hochladen (Benötigt aber SAMBA, WEBDAV o.ä)
    Lösung 3 : Du schreibst einen RMI-Server der das Zeug annimmt und serialisierst die Chunks dahin (Benötigt einen RMI-Server)

    Grüße
    gore
     

  13. #13
    Coke_ ist offline Grünschnabel
    Registriert seit
    May 2011
    Beiträge
    3
    Ersteinmal wollte ich mich für den Thread bedanken, es klappt wirklich 1A und ist wesendlich schneller als die methoden die ich vorher hatte...
    Eine kleine Frage noch, wie kann ich das nun in Verbindung mit einer progress bar bringen? Sodass es noch ein bisschen schöner ausschaut. Ich hab das leider nicht hinbekommen...
     

  14. #14
    Adi_M ist offline Grünschnabel
    Registriert seit
    Jul 2011
    Beiträge
    4
    Coke_, einen ProgressBar könnt ich dir anbieten. Hab den in die transfer-Methode von Thomas "reingepfropft", da er in dieser Methode alle Parameter, die für einen ProgressMonitor nötig sind, übergibt.
    Was mich auch wiederum gleich zu einer Frage meinerseits, an die Profis, bringt: Dieses "reinstöpseln" eines ProgressMonitors in diese Methode scheint mir ziemlich dirty. Könntet ihr mir da Empfehlungen bzw. Tipps geben wie man das sauber hinkriegt.
    Davon würden Coke(wenn er hier noch aktiv mitliest) u. meine Wenigkeit sehr profitieren.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    
        public static void transfer(FileChannel inputChannel, ByteChannel outputChannel,
            long lengthInBytes, long chunckSizeInBytes, boolean verbose) throws IOException
        {
            progMonitor = new ProgressMonitor(null, "Kopiere " + src.getName(), "Kopiert... ", 0, 100);
            long overallBytesTransfered = 0L;
            while (overallBytesTransfered < lengthInBytes && verbose)
            {
                long bytesToTransfer = Math.min(chunckSizeInBytes, lengthInBytes - overallBytesTransfered);
                long bytesTransfered = inputChannel.transferTo(overallBytesTransfered, bytesToTransfer,
                    outputChannel);
     
                overallBytesTransfered += bytesTransfered;
                double megabyte = overallBytesTransfered / 1048576;
                if (verbose && progMonitor != null)
                {
                    long percentageOfOverallBytesTransfered = Math.round(overallBytesTransfered / ((double) lengthInBytes) * 100.0);
                    progMonitor.setNote("<html>Fortschritt: " + percentageOfOverallBytesTransfered + " %<br>"
                        + "MB übertragen: " + megabyte);
                    progMonitor.setProgress((int) percentageOfOverallBytesTransfered);
                    // createlogfile("overall bytes transfered: " +
                    // overallBytesTransfered +
                    // "\tPercent transferred " + percentageOfOverallBytesTransfered + "%");
                }
            }
            if (progMonitor != null)
            {
                progMonitor.close();
            }
            progMonitor = null;
     
        }

    Danke im Voraus, für eure Empfehlungen bzw. Tipps.
     

  15. #15
    JavaCoffeeDrinker ist offline Grünschnabel
    Registriert seit
    Nov 2011
    Beiträge
    1
    Hallo liebe Community,
    ich bin noch ein ziemlicher Java Anfänger und begreife nicht wie man den Code von Adi_M in den von Thomas einbinden kann. Ich bastle gerade an einem Installer und könnte dies daher sehr gut gebrauchen.
    Thx
     

Thema nicht erledigt
Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Magick in .Net - große Tabellen schnell verwalten
    Von LL0rd im Forum .NET Windows Forms
    Antworten: 0
    Letzter Beitrag: 02.10.09, 23:56
  2. Sehr große Tile Map schnell u. mit geringem Speicherverbrauch anzeigen?
    Von karl-alfons im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 6
    Letzter Beitrag: 12.06.09, 17:08
  3. Win2k Server: Große Datei >20GB kopieren/verschieben
    Von MasterDS im Forum Microsoft Windows
    Antworten: 1
    Letzter Beitrag: 14.05.09, 11:57
  4. sehr große MySQL-Tabelle kopieren
    Von maxikey im Forum PHP
    Antworten: 7
    Letzter Beitrag: 14.10.08, 15:41
  5. Schnell Übersicht über große Java Projekte bekommen
    Von Thomas Darimont im Forum Java
    Antworten: 0
    Letzter Beitrag: 13.12.06, 10:31