在 FileChannel 和 Socket 之间传输文件

我正在用 Java 编写一个多线程服务器。服务器从/向客户端传输文件。项目的一个需求是使用 NIO 来处理文件。

由于服务器是多线程的,所以我没有使用 SocketChannels 进行通信,而是使用简单的 Sockets。

为了满足 NIO 的要求,我不得不使用 FileChannels 来读取/写入文件。现在的问题是:在 FileChannel 和非通道的东西(比如简单的 Socket)之间传输文件有意义吗?我必须切换到 SocketChannels 吗?

我问这个是因为我一直看到像这样的传输总是在两个渠道之间进行,所以我对此有点怀疑。


拉风的咖菲猫
浏览 123回答 1
1回答

一只名叫tom的猫

在 FileChannel > 和非通道的东西(如简单的 Socket)之间传输文件是否有意义?是的,它确实。FileChannel,Socket并且SocketChannel是对低级操作系统系统调用的 Java 语言抽象。我不知道它在其他操作系统上是如何工作的,但是在 Linux 和(可能是其他一些符合 POSIX 的操作系统上)它是通过read/ write/ sendmsg/etc.. 系统调用实现的。如果您使用的是 NIO 选择器,它很可能委托给epolling 文件描述符。看看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 中完成这种零拷贝传输。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java