2014-04-07 19 views
1

我在这行代码:InputStream.read(array)不返回array.length时到达的流结束了吗?

final int packetLength = 64 //just some constant 
InputStream in = socket.getInputStream(); 
byte[] packet = new byte[packetLength]; 
int read = in.read(packet, 0, packetLength) 

if(read != packetLength) { 
    //End of stream= 
} 

我可以肯定地说,如果read(byte[], int, int)不返回相同的值,因为它应该阅读的长度,流到达流的末尾?

因为下一次read()调用应该返回-1不应该吗?

回答

3

不,你不能确定这一点。 InputStream在读取所有您请求的数据之前不会阻塞 - 它会一直阻塞,直到它被读取一些数据。

你应该阅读,直到read调用返回-1(的InputStream读,直到它读到的一切是可以的,但不能保证该子类实现会这样做的默认实现。) - 或者,如果你只是想

byte[] packet = new byte[packetLength]; 
int offset = 0; 
while (offset < packetLength) { 
    int bytesRead = in.read(packet, offset, packetLength - offset); 
    if (bytesRead == -1) { 
     // Incomplete packet - handle however you want to 
    } 
    offset += bytesRead; 
} 
// Hooray - read the complete packet. 
+0

因此,让'以上in'在例如是一个SocketInputStream,我应该调用读取(字节[],INT,INT)连连和总是将数据追加到缓冲器直到:恰好packetLength字节读读取方法最后返回-1或packetLength字节被读取? – MinecraftShamrock

+1

@MinecraftShamrock:如果你只想读'packetLength'字节,那很好。如果你想读到流的末尾,你需要继续阅读,直到'read'返回-1。 –

+0

我想读取'packetLength'字节。但是直到现在,如果读取的字节少于'packetLength',我将它作为流结束。所以我不想读到流结束,但我需要知道是否已达到流的结束。 – MinecraftShamrock

相关问题