2012-03-27 13 views
1

Ich habe mit NIO2 in Java 7 gespielt und ich nahm an, dass die AsynchronousFileChannel eine transferTo Methode wie ihre synchrone FileChannel Geschwister haben würde.Gibt es ein Äquivalent zu TransferTo für AsynchronousFileChannel?

Ich suche eine Nullkopie-Übertragung zwischen einer lokalen Datei und einem offenen TCP-Socket durchzuführen. Ich habe versucht, einfach eine FileChannel zu erstellen und transferTo mit meinem AsynchronousSocketChannel als das letzte arg, aber in der async Socket-Version zu sehen ist kein WritableByteChannel, Java wird es nicht haben.

Mit dieser als Option ausgeschlossen, weiß jemand eine Problemumgehung oder externe Bibliothek, die es mir erlauben würde, Bytes zu einem AsynchronousSocketChannel Nutzung DMA (und damit ohne Puffer im Benutzer-Raum) zu pipettieren?

Antwort

1

transferTo() ist kein asynchroner Vorgang. Die Durchführung auf einem asynchronen Kanal macht also keinen Sinn. So ist es nicht vorgesehen.

+0

Tatsache bleibt, dass das Verschieben von Daten aus asynchronen Dateikanälen -> asynchronen Socket-Kanälen die Erstellung eines Zwischenbytepuffers beinhaltet, der mit 'transferTo' vermieden werden könnte, wenn auch auf einem anderen Thread; transferTos Synchronität kommt nicht dazu. [diese Diskussion] (http://mail.openjdk.java.net/pipermail/nio-dev/2011-December.txt) deutet darauf hin, dass es ein allgemeines Interesse, aber keine bestimmte Zeitlinie gibt. Vielleicht werde ich sehen, ob ich etwas selbst kochen kann ... –

+0

@ChrisMowforth Es sollte auch angemerkt werden, dass die angebliche Nur-Kernel-Implementierung, die als eine Möglichkeit in dem Javadoc beschrieben wird, tatsächlich nicht existiert, zumindest in den Windows, Solars und Linux-Implementierungen, auf die ich Quellcode zugreifen kann. Es ist so implementiert, wie Sie es selbst tun würden, mit einem direkten Byte-Puffer und einer Schleife. Das würde es demotivieren, es auch zu liefern. – EJP