从套接字读取文件的正确方法是什么?因为即使在客户端写入文件已经完成,读取文件的循环也不会结束。如果我仍然要读取数据,我甚至尝试打印缓冲区位置和长度。
这是我读取文件的代码。
private void readActualData(SocketChannel socketChannel) {
RandomAccessFile aFile = null;
System.out.println("Reading actual Data");
try {
aFile = new RandomAccessFile(path, "rw");
ByteBuffer buffer = ByteBuffer.allocate(50000000);
FileChannel fileChannel = aFile.getChannel();
int length;
while ((length = socketChannel.read(buffer)) >= 0 || buffer.position() > 0) {
buffer.flip();
fileChannel.write(buffer);
buffer.compact();
System.out.println("Length : "+length+" and Buffer position : "+buffer.position());
}
fileChannel.close();
System.out.println("End of file reached..Done Reading");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
答案 0 :(得分:3)
此代码假定对等体在文件完全发送后关闭套接字。如果不是这种情况,则需要更复杂的东西,首先在文件之前传输文件长度,然后将从套接字读取的数量限制为该长度。我提供了阻塞模式套接字here的示例,但是将其调整为NIO并非易事。