1 回答

TA貢獻1906條經驗 獲得超3個贊
在 FileChannel > 和非通道的東西(如簡單的 Socket)之間傳輸文件是否有意義?
是的,它確實。
FileChannel
,Socket
并且SocketChannel
是對低級操作系統系統調用的 Java 語言抽象。我不知道它在其他操作系統上是如何工作的,但是在 Linux 和(可能是其他一些符合 POSIX 的操作系統上)它是通過read
/ write
/ sendmsg
/etc.. 系統調用實現的。如果您使用的是 NIO 選擇器,它很可能委托給epoll
ing 文件描述符??纯?code>EPollSelectorProvider。
我必須切換到 SocketChannels 嗎?
要看。NIO 支持零拷貝文件:https ://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/channels/FileChannel.html#transferTo(long,long ,java.nio.channels.WritableByteChannel)。Linux 確實通過sendfile
系統調用支持這一點:http: //man7.org/linux/man-pages/man2/sendfile.2.html
它將使您能夠允許內核內文件傳輸,避免從文件和套接字進行不必要的讀寫。Socket
如果您使用純s ,則無法在 Java 中完成這種零拷貝傳輸。
添加回答
舉報