2016-12-12 3 views
0

私はAsynchronousFileChannelを使ってデータを読み込みます。次のように は、データを読み出すため、私は2つの読み出し方法を発見した:以下のように指定されたJavaのドキュメントとしてAsynchronousFileChannelでCompletionHandlerを使用してデータを読み取るのはどうですか?

//1. 
Future<Integer> java.nio.channels.AsynchronousFileChannel.read(ByteBuffer dst, long position); 

//2. 
void java.nio.channels.AsynchronousFileChannel.read(ByteBuffer dst, long position, A attachment, CompletionHandler<Integer, ? super A> handler) 

、関数の第三のパラメータとして使用されるCompletionHandlerに関する情報がない。

このチャネルから指定されたファイル位置から開始して、指定されたバッファに一連のバイトを読み込みます。

このメソッドは、指定されたファイル位置から開始して、このチャネルから指定されたバッファへのバイトシーケンスの読み取りを開始します。読み込みの結果、読み込まれたバイト数が返されます。読み込みが試行された時点で、指定された位置がファイルのサイズ以上である場合は-1です。

このメソッドは、AsynchronousByteChannel.read(ByteBuffer、Object、CompletionHandler)メソッドと同じ方法で動作しますが、指定されたファイル位置からバイトが読み込まれる点が異なります。指定されたファイルの位置が、読み込みが試行された時点でのファイルのサイズより大きい場合、バイトは読み込まれません。

誰でも私に3番目のパラメータとCompletionHandlerの動作例について教えていただけますか?なぜCompletionHandlerを必要とし、その使用法は何ですか?ここで

+4

*非同期*読み取り操作がいつ終了したかをどのように知っていますか? #1では、あなたは 'Future 'を取得し、#2では、完了したときにあなた自身のCompletionHandlerを渡します。関連項目https://docs.oracle.com/javase/7/docs/api/java/nio/channels/CompletionHandler.html – JimmyB

+4

[Javadoc](https://docs.oracle.com/javase/7/)から、 "read(java.nio.ByteBuffer、%20A、%20java.nio.channels.CompletionHandler))):"ハンドラパラメータは、読み込み時に呼び出される補完ハンドラです完了ハンドラに渡される結果は、読み込まれたバイト数です。チャネルがストリームの終わりに達したために読み込めるバイトがない場合は-1です。 –

答えて

2

私は次のように働いて検索し得た例である:

try(AsynchronousFileChannel asyncfileChannel = AsynchronousFileChannel.open(Paths.get("/Users/***/Documents/server_pull/system_health_12_9_TestServer.json"), StandardOpenOption.READ)){ 
     ByteBuffer buffer = ByteBuffer.allocate(1024); 
     ByteBuffer attachment = ByteBuffer.allocate(1024); 
     asyncfileChannel.read(buffer, 0, attachment, new CompletionHandler<Integer, ByteBuffer>() { 
      @Override 
      public void completed(Integer result, ByteBuffer attachment) { 
       System.out.println("result = " + result); 

       attachment.flip(); 
       byte[] data = new byte[attachment.limit()]; 
       attachment.get(data); 
       System.out.println(new String(data)); 
       attachment.clear(); 
      } 

      @Override 
      public void failed(Throwable exc, ByteBuffer attachment) { 

      } 
     }); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 

以下は、処理内容である:

読み出し動作が終了したら、CompletionHandlerの完成()メソッド呼び出されます。 completed()メソッドのパラメータには、読み込まれたバイト数とread()メソッドに渡された "attachment"を示すIntegerが渡されます。 "attachment"は、read()メソッドの3番目のパラメータです。この場合、データが読み込まれるのはByteBufferです。

読み取り操作が失敗した場合、CompletionHandlerのfailed()メソッドが代わりに呼び出されます。

関連する問題