从套接字读取文件的正确方法是什么?
What is the correct way of reading files in from the socket?
从套接字读取文件的正确方法是什么?因为即使在客户端写入文件已经完成,读取文件的循环也不会结束。如果我还有数据要读取,我什至尝试打印缓冲区位置和长度。
这是我读取文件的代码。
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();
}
}
此代码假定对等方在文件已完全发送后关闭套接字。如果不是这种情况,您需要更复杂的东西,首先在文件之前传输文件长度,然后将从套接字读取的数量限制为恰好该长度。我提供了一个阻塞模式套接字的示例 here,但将其适应 NIO 并非易事。
从套接字读取文件的正确方法是什么?因为即使在客户端写入文件已经完成,读取文件的循环也不会结束。如果我还有数据要读取,我什至尝试打印缓冲区位置和长度。
这是我读取文件的代码。
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();
}
}
此代码假定对等方在文件已完全发送后关闭套接字。如果不是这种情况,您需要更复杂的东西,首先在文件之前传输文件长度,然后将从套接字读取的数量限制为恰好该长度。我提供了一个阻塞模式套接字的示例 here,但将其适应 NIO 并非易事。