1 回答

TA贡献1906条经验 获得超3个赞
在 FileChannel > 和非通道的东西(如简单的 Socket)之间传输文件是否有意义?
是的,它确实。
FileChannel
,Socket
并且SocketChannel
是对低级操作系统系统调用的 Java 语言抽象。我不知道它在其他操作系统上是如何工作的,但是在 Linux 和(可能是其他一些符合 POSIX 的操作系统上)它是通过read
/ write
/ sendmsg
/etc.. 系统调用实现的。如果您使用的是 NIO 选择器,它很可能委托给epoll
ing 文件描述符。看看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 中完成这种零拷贝传输。
添加回答
举报