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 }