public final int collect(final int threshold) {
        if (delcount <= threshold) {
            return 0;
        }

        virgin = false;

        final int nsize = size - delcount;
        if (nsize == 0) {
            faid = null;
            fapos = null;
        } else {
            final int[] nfaid = new int[nsize];
            final int[] nfapos = new int[nsize];
            int idx = 0;

            final byte[] nab = new byte[ab.length - delbytes];
            int nabOff = 0;
            for (int i = 0; i < size; i++) {
                final int pos = fapos[i];
                if ((pos & 0x80000000) == 0) {
                    final int start = startPos(i);
                    final int end = fapos[i];
                    final int len = end - start;
                    System.arraycopy(ab, start, nab, nabOff, len);
                    nfaid[idx] = faid[i];
                    nabOff += len;
                    nfapos[idx] = nabOff;
                    idx++;
                }
            }
            faid = nfaid;
            fapos = nfapos;
            ab = nab;
        }
        final int deleted = delbytes;
        init(nsize);
        return deleted;
    }
Set the internal reader (aboffset, aboffsetEnd) to the body data for the given id
<p>
If a node is not found in an empty cache, this is usually an edge-effect
(data-file does not exist or neighboured data-files of differnt age),
but is can as well be a symptom of a node-identity breaking bug.
<p>
Current implementation always returns false for not-found, however, for
regression testing, at least for the case that is most likely a bug
(node found but marked as deleted = ready for garbage collection
= already consumed) the RunException should be re-enabled

@return true if id was found
main/src/main/java/cgeo/geocaching/brouter/codec/MicroCache.java