いや、getLength() != -1 のほうの

  data = new byte[(int)hc.getLength()];
  in.read(data);

これは良くない
↓のようにするか

data = new byte[(int)hc.getLength()];
int i = 0, n;
while ((n = in.read(data, i, data.length - i)) >= 0) {
i += n;
}

面倒かったら↓で

data = new byte[(int)hc.getLength()];
new DataInputStream(in).readFully(data);