簡體   English   中英

Java 為什么 DatagramPacket 的構造函數需要字節數組的長度?

[英]Java Why does the constructor for a DatagramPacket need the length of the byte array?

根據javadocs,DatagramPacket 類中的構造函數需要一個字節數組和一個小於或等於該數組長度的整數。 例如:

DatagramPacket(byte[] buf, int length)

我看到的所有示例都只是像這樣傳遞字節數組的長度屬性:

byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

對於這個(常見)用例,訪問構造函數內傳遞的字節數組的長度屬性會更簡單。 為什么所有構造函數都明確需要長度參數?

“為什么”這個問題的准確答案就是“因為”。 規范是這樣說的,並注意DatagramPacket從一開始就成為 java 的一部分(我猜是在 Oak 之后):javadoc 被標記為@since 1.0

我們所能做的就是猜測這個 API 的原始開發者在想什么。

所以我會嘗試這樣做:

  1. 該 API 早於提供(dataStore)(dataStore, offset, length)變體(並且沒有其他變體)的約定。 例如,在new String(byteArray, offset, length, charset)構造函數中,以及幾乎所有其他出現這種概念的地方,您必須在傳遞整個數據存儲區或同時傳遞偏移量和長度之間做出選擇; 你永遠不能只傳遞長度並將偏移量默認為 0。但你可以在這里; 那是因為這個公約還不是一回事。

  2. “傳遞一個偏移量和一個長度”這個概念存在的原因,不只是在這里,而是基於字符串的基於字節數組的構造函數,以及包含write(byte[] data)write(byte[] data)以及write(byte[] data, int offset, int length) OutputStream的 write 方法write(byte[] data, int offset, int length)變體以及 java 核心庫中的許多其他地方,是因為通常您擁有的緩沖區大於您擁有的數據量。 如果您還不知道要在數據報包中發送多少數據,您可以將所有數據生成為自增長結構,如ByteArrayOutputStreamStringBuilderArrayList<Byte> ,寫出所有數據,然后從中提取適當大小的byte[]數組。 或者,這是非常有效的,你制作了一個絕對足夠大的字節數組來存儲你要制作的任何東西,如果必須的話,可以選擇使用ThreadLocal重用它,一旦你完成,只有現在你知道它實際上必須有多大。 而不是制作另一個大小合適的字節數組並復制所有字節,只需..發送'緩沖區數組'的前X個字節,節省內存和復制操作。 也有不想以同樣的方式從 0 開始的原因。 這就是為什么DatagramPacket還有一個(byte[] buf, int offset, int length)構造函數,這也解釋了為什么字節數組的參數名實際上是buf (buffer 的縮寫,注意它不是更明顯的名稱data )。

  3. ByteBuffer是一個專門為此設計的概念。 我不確定為什么DatagramPacket仍然沒有構造函數來處理這些,但 datagrampacket 本身比字節緩沖區早十年或更長時間。 如果字節緩沖區是 1.0 語言的一部分,這可能會用字節緩沖區來完成,它完全代表了具有固定大小緩沖區的概念,並且非常有效地擁有處理潛在未知長度數據的代碼以進行寫入/讀取它恰好位於正確的位置,並且不超過某些限制,以避免必須在所有地方制作字節數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM