@Override
      public void run() {
        final int bufferSize = 1024;
        final byte[] buf = new byte[bufferSize];
        int readlen;
        int readSize = bufferSize;
        long total = 0;
        try {
          while ((readlen = _stream.read(buf, 0, readSize)) != 0) {
            _file.write(buf, 0, readlen);
            _handler.sendProgressUpdateMessage(readlen);
            total += readlen;

            if (total >= _readCap) {
              break;
            }

            final int remain = (int) (_readCap - total);
            if (remain < bufferSize) {
              readSize = remain;
            }
          }
        } catch (final IOException e) {
          e.printStackTrace();
        } finally {
          try {
            _stream.close();
          } catch (final Exception e) {
            e.printStackTrace();
          }
          try {
            _file.close();
          } catch (final Exception e) {
            e.printStackTrace();
          }
        }

        synchronized (Downloader.this) {
          _threadFinishedCount++;
          Downloader.this.notify();
        }
      }