[英]Transerring files between FileChannel and Socket
我正在用 Java 編寫多線程服務器。 服務器從/向客戶端傳輸文件。 項目的一個需求是使用NIO來處理文件。
由於服務器是多線程的,我沒有使用 SocketChannels 進行通信,而是使用簡單的 Sockets。
為了滿足 NIO 要求,我不得不使用 FileChannels 來讀取/寫入文件。 現在的問題是:在 FileChannel 和不是通道的東西(如簡單的 Socket)之間傳輸文件是否有意義? 我必須切換到 SocketChannels 嗎?
我問這個是因為我一直看到像這樣的轉移總是在兩個渠道之間進行,所以我對此有點懷疑。
在 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
它將使您能夠允許內核文件傳輸,避免從文件和套接字進行不必要的讀寫。 AFAIK 如果您使用普通的Socket
s,則無法在 Java 中完成這種零拷貝傳輸。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.