FileChannel.transferTo für große Dateien in Windows

8

Mit Java NIO können Sie Dateien schneller kopieren. Ich habe zwei Methoden hauptsächlich über das Internet gefunden, um diesen Job zu machen.

%Vor%

In 20 sehr nützliche Java-Code-Snippets für Java Entwickler Ich habe einen anderen Kommentar und Trick gefunden:

%Vor%

Aber ich habe nicht gefunden oder verstanden, was

bedeutet
  

"magische Zahl für Windows, (64Mb - 32Kb)"

Es besagt, dass inChannel.transferTo(0, inChannel.size(), outChannel) in Windows ein Problem hat, 32768 (= (64 * 1024 * 1024) - (32 * 1024)) Byte ist für diese Methode optimal.

    
Tapas Bose 11.09.2011, 16:04
quelle

3 Antworten

6

Windows hat eine harte Grenze für die maximale Übertragungsgröße, und wenn Sie diese überschreiten, erhalten Sie eine Laufzeitausnahme. Sie müssen also stimmen. Die zweite Version, die Sie angeben, ist besser, weil sie nicht davon ausgeht, dass die Datei vollständig mit einem transferTo() -Aufruf übertragen wurde, was mit dem Javadoc übereinstimmt.

Die Übertragungsgröße von mehr als 1 MB ist sowieso ziemlich sinnlos.

BEARBEITEN Ihre zweite Version hat einen Fehler. Sie sollten size um den übertragenen Betrag verringern. Es sollte eher wie folgt aussehen:

%Vor%     
EJP 13.09.2011, 08:05
quelle
0

Ich habe gelesen, dass es für die Kompatibilität mit dem Windows 2000-Betriebssystem ist.

Quelle: Ссылка

Quote: In win2000 überträgt der transferTo () keine Dateien & gt; als 2 ^ 31-1 Bytes. Es wird die Ausnahme "java.io.IOException: Es werden nicht genügend Systemressourcen vorhanden, um den angeforderten Dienst auszuführen, ausgelöst." Die Problemumgehung besteht darin, jedes Mal in einer Schleife 64 MB zu kopieren, bis keine Daten mehr vorhanden sind.

    
Danny Rancher 04.01.2014 03:26
quelle
-1

Es scheint anekdotische Beweise dafür zu geben, dass Versuche, mehr als 64 MB gleichzeitig auf bestimmten Windows-Versionen zu übertragen, zu einer langsamen Kopie führen. Daher die Überprüfung: Dies scheint das Ergebnis einiger Details des zugrunde liegenden systemeigenen Codes zu sein, der die Operation transferTo unter Windows implementiert.

    
Femi 11.09.2011 16:12
quelle

Tags und Links