从套接字读取文件的正确方法是什么?

时间:2016-04-30 02:52:04

标签: java sockets nio filechannel

从套接字读取文件的正确方法是什么?因为即使在客户端写入文件已经完成,读取文件的循环也不会结束。如果我仍然要读取数据,我甚至尝试打印缓冲区位置和长度。

这是我读取文件的代码。

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();
    }
}

1 个答案:

答案 0 :(得分:3)

此代码假定对等体在文件完全发送后关闭套接字。如果不是这种情况,则需要更复杂的东西,首先在文件之前传输文件长度,然后将从套接字读取的数量限制为该长度。我提供了阻塞模式套接字here的示例,但是将其调整为NIO并非易事。