2011年8月15日月曜日

ObjectInputStreamの進捗を知りたい

早速メモ1つ目。。。

Socketでの通信で、ダウンロードの進捗をプログレスで出したい時の方法です。

読み込みのループ処理で、読み込みバイト数をカウントする方法もありますが、
ObjectInputStreamのreadObjectでは使えないので。。。


結論から言うと、CountingInputStreamを使用します。
CountingInputStreamは、org.apache.commons.ioパッケージにありますので、
この辺から入手してください。
http://commons.apache.org/io/

使い方は簡単です。
例えば、ObjectInputStreamの読み込み状況を知りたいときは、以下のように書きます。

private CountingInputStream cis = null;
.
.
.
public void readObjectBySocket(InetAddress address, int port){
  try{
    Socket sock = new Socket(address,port);
    cis = new CountingInputStream(sock.getInputStream());
    ObjectInputStream inStream = new ObjectInputStream(cis);
    receiveObject = inStream.readObject();
 
    inStream.close();
    cis.close();
    sock.close();
  }
  catch(Exception e){
    e.printStackTrace();
  }
}

//cisからダウンロード完了したバイトサイズを取得するには、getByteCountを使用します。
public long getCount(){
  if(cis==null){
    return 0;
  }
  return cis.getByteCount();
}


こんな感じ。例外とかは適当です。
ただし、readObject()で受信完了待ちになるので、
別スレッドなどから
cisにアクセスしましょう。
3.0からは、通信処理は、AsyncTaskでやる必要があるので、ちょうどいいです。

多分これで取得できるはず。。。

0 件のコメント: