亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 FileChannel 和 Socket 之間傳輸文件

在 FileChannel 和 Socket 之間傳輸文件

拉風的咖菲貓 2022-06-15 10:39:00
我正在用 Java 編寫一個多線程服務器。服務器從/向客戶端傳輸文件。項目的一個需求是使用 NIO 來處理文件。由于服務器是多線程的,所以我沒有使用 SocketChannels 進行通信,而是使用簡單的 Sockets。為了滿足 NIO 的要求,我不得不使用 FileChannels 來讀取/寫入文件?,F在的問題是:在 FileChannel 和非通道的東西(比如簡單的 Socket)之間傳輸文件有意義嗎?我必須切換到 SocketChannels 嗎?我問這個是因為我一直看到像這樣的傳輸總是在兩個渠道之間進行,所以我對此有點懷疑。
查看完整描述

1 回答

?
一只名叫tom的貓

TA貢獻1906條經驗 獲得超3個贊

在 FileChannel > 和非通道的東西(如簡單的 Socket)之間傳輸文件是否有意義?

是的,它確實。

FileChannel,Socket并且SocketChannel是對低級操作系統系統調用的 Java 語言抽象。我不知道它在其他操作系統上是如何工作的,但是在 Linux 和(可能是其他一些符合 POSIX 的操作系統上)它是通過readwritesendmsg/etc.. 系統調用實現的。如果您使用的是 NIO 選擇器,它很可能委托給epolling 文件描述符??纯?code>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 中完成這種零拷貝傳輸。


查看完整回答
反對 回復 2022-06-15
  • 1 回答
  • 0 關注
  • 144 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號