2016-04-30 21 views
1

実際にソケットからファイルを読み取る正しい方法は何ですか?クライアント側でファイルの書き込みが終了しても、ファイルの読み込みループが終了しないためです。私はまだバッファの位置と長さを印刷しようとしましたが、それでも読み取るデータがあれば。ソケットからファイルを読み込む正しい方法は何ですか?

ここにファイルを読むための私のコードです。

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

答えて

3

このコードは、ファイルが完全に送信されたときにピアがソケットを閉じることを前提としています。そうでない場合は、ファイルよりも先にファイル長を送信してから、ソケットから読み取られた量を正確にその長さに制限することから始めて、はるかに複雑なものが必要になります。ブロッキングモードソケットhereの例を示しましたが、NIOに適合させるのは簡単ではありません。

+0

私は、複数のファイルの場合に必要なことを熟考しました。ファイルの最初の長さをカウントダウンする必要があります。読み込みループの終わりに 'buffer.limit() - buffer.position()'の値より小さくなると、バッファの制限を調整する必要がありますそうでないように。 – EJP

関連する問題