![](/img/trans.png)
[英]Java NIO. SocketChannel.read method all time return 0. Why?
[英]Java NIO. Why flip() method breaks my program?
下面的Java代碼:
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
public class Test {
public static void main(String args[]) throws IOException {
SocketChannel c = SocketChannel.open();
c.connect(new InetSocketAddress("google.com", 80));
ByteBuffer b = ByteBuffer.allocate(1024);
b.put("Request".getBytes());
System.out.println("Write: " + c.write(b));
int i;
while ((i = c.read(b)) != -1) {
System.out.println("Read: " + i);
b.clear();
}
}
}
實際結果:
寫:1017讀:0讀:1024讀:44
第一次,方法read()
讀取0個字節。 這不酷。
我修改了代碼:
b.put("Request".getBytes());
System.out.println("Write: " + c.write(b));
b.flip(); //I added this line
int i;
while ((i = c.read(b)) != -1) {
System.out.println("Read: " + i);
b.clear();
}
實際結果:
寫:1017讀:1024讀:44
它看起來已經更好了。 感謝flip()
!
接下來,我將緩沖區字符串“ Request”放入緩沖區,該字符串的長度為7 ,但是方法write()
返回1017 。
哪種信息方法寫給渠道?
我不確定,該方法寫了字符串“ Request” 。
好的,我再次修改了代碼:
b.put("Request".getBytes());
b.flip(); // I added this line
System.out.println("Write: " + c.write(b));
b.flip();
int i;
while ((i = c.read(b)) != -1) {
System.out.println("Read: " + i);
b.clear();
}
實際結果:
寫:7
代碼崩潰了...
為什么? 我的錯誤在哪里?
謝謝。
在從緩沖區讀取數據之前 ,需要調用flip
方法。 flip()
方法,將緩沖區的limit
重置為當前位置,並將緩沖區的position
重置為0。
因此,如果ByteBuffer
有7個字節的數據,則您的位置(從0開始)為flip()
將其設為limit = 7
, position = 0
。 現在,可以進行閱讀了。
這是一個關於如何最好地使用flip()
的示例:
public static final void nioCopy(ReadableByteChannel input, WritableByteChannel output) throws IOException {
ByteBuffer buffer = ByteBuffer.allocate(DEFAULT_BUFFER_SIZE);
while (input.read(buffer) != -1) {
//Flip buffer
buffer.flip();
//Write to destination
output.write(buffer);
//Compact
buffer.compact();
}
//In case we have remainder
buffer.flip();
while (buffer.hasRemaining()) {
//Write to output
output.write(buffer);
}
}
盡管其名稱(選擇不當), flip()
還是不對稱的。 您必須在從緩沖區進行的任何操作(寫入或獲取)之前調用它,然后再調用compact()
或clear()
將緩沖區放回可以讀取或放置的狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.