簡體   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