InputStream class’ının skip methodu bir datayı okurken okumak istemediğimiz kadar veriyi atlamamızı sağlaması gereken bir fonksiyon. Parametre olarak kaç byte skip edileceğini alıyor ve return olarak da kaç byte skip ettiğini dönüyor. Yani dosyanın sonuna gelinmediği sürece parametresi ile return değerinin eşit olması gerekiyor, mantıken. Ama bazı durumlarda nedense atladığı data parametre olarak verdiğimizden çok daha ufak, neredeyse onda biri olabiliyor.

Az önce bu problem yüzünden yaklaşık 1 saatimi harcadım. Çözümü de yine her zaman olduğu gibi stackoverflow‘da buldum.

Bu sorunu düzelten fonksiyonu kendime göre düzenledim ve şu şekilde kullanmaya başladım:

private static long skip(InputStream s, long numbytes) throws IOException {
    if (numbytes <= 0) {
        return 0;
    }
    long n = numbytes;
    int buflen = (int) Math.min(1024, n);
    byte data[] = new byte[buflen];
    while (n > 0) {
        int r = s.read(data, 0, (int) Math.min((long) buflen, n));
        if (r < 0) {
            break;
        }
        n -= r;
    }
    return numbytes - n;
}

Java, kendisi de bu şekilde yaptığını söylüyor bize aslında. Bir byte array’i yaratıp onun içerisine okuyarak skip ediyormuş datayı. Biz de aynı şekilde yaptık. O yaptı çalışmadı, biz yaptık çalıştı. Garip.