001    package com.imagero.uio.io;
002    
003    import java.io.FilterInputStream;
004    import java.io.IOException;
005    import java.io.InputStream;
006    
007    /**
008     * Date: 30.07.2007
009     *
010     * @author Andrey Kuznetsov
011     */
012    public class SkipBytesInputStream extends FilterInputStream {
013    
014        static long[] msk = createMask();
015    
016        private static long[] createMask() {
017            long[] m = new long[64];
018            m[0] = 1;
019            for (int i = 1; i < m.length; i++) {
020                m[i] = m[i - 1] << 1;
021            }
022            return m;
023        }
024    
025        public SkipBytesInputStream(InputStream in, long mask, int mod) {
026            super(in);
027            this.mask = mask;
028            this.mod = mod;
029        }
030    
031        int fp;
032        long mask;
033        int mod;
034    
035        public int read() throws IOException {
036            if (mask == 0) {
037                return super.read();
038            } else {
039                int a = in.read();
040                long k = msk[(fp++ % mod)] & mask;
041                if (k != 0) {
042                    return a;
043                } else {
044                    return read();
045                }
046            }
047        }
048    
049        public int read(byte b[], int off, int len) throws IOException {
050            int k = in.read(b, off, len);
051            return read0(b, off, k);
052        }
053    
054        private int read0(byte[] b, int off, int len) {
055            if (mask == 0) {
056                return len;
057            }
058            int len0 = 0;
059            int p = off;
060            for (int i = 0; i < len; i++) {
061                if ((msk[(fp++ % mod)] & mask) != 0) {
062                    b[p++] = b[i];
063                    len0++;
064                }
065            }
066            return len0;
067        }
068    }