我正在用 Java 编写一个多线程服务器。服务器从/向客户端传输文件。项目的一个需求是使用 NIO 来处理文件。由于服务器是多线程的,所以我没有使用 SocketChannels 进行通信,而是使用简单的 Sockets。为了满足 NIO 的要求,我不得不使用 FileChannels 来读取/写入文件。现在的问题是:在 FileChannel 和非通道的东西(比如简单的 Socket)之间传输文件有意义吗?我必须切换到 SocketChannels 吗?我问这个是因为我一直看到像这样的传输总是在两个渠道之间进行,所以我对此有点怀疑。
1 回答
一只名叫tom的猫
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 中完成这种零拷贝传输。
添加回答
举报
0/150
提交
取消