繁体   English   中英

在 FileChannel 和 Socket 之间传输文件

[英]Transerring files between FileChannel and Socket

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

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

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

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

在 FileChannel > 和不是通道的东西(如简单的 Socket)之间传输文件有意义吗?

是的,它确实。

FileChannelSocketSocketChannel是对底层操作系统系统调用的 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

它将使您能够允许内核文件传输,避免从文件和套接字进行不必要的读写。 AFAIK 如果您使用普通的Socket s,则无法在 Java 中完成这种零拷贝传输。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM