1 32 package com.imagero.uio.io; 33 34 import com.imagero.uio.RandomAccessRO; 35 36 import java.io.IOException ; 37 import java.io.InputStream ; 38 39 43 public class RandomAccessInputStream extends InputStream { 44 protected static long MARK_UNDEFINED = -1L; 45 46 protected RandomAccessRO ro; 47 protected long pos; 48 protected long mark = MARK_UNDEFINED; 49 protected long startPos; 50 51 52 public RandomAccessInputStream(RandomAccessRO ro) { 53 this(ro, 0L); 54 } 55 56 public RandomAccessInputStream(RandomAccessRO ro, long startPos) { 57 this.ro = ro; 58 this.pos = startPos; 59 this.startPos = startPos; 60 } 61 62 synchronized public int read() throws IOException { 63 checkPos(); 64 int a = ro.read(); 65 pos++; 66 return a; 67 } 68 69 public int read(byte[] b) throws IOException { 70 return read(b, 0, b.length); 71 } 72 73 synchronized public int read(byte[] b, int off, int len) throws IOException { 74 checkPos(); 75 int r = ro.read(b, off, len); 76 pos += r; 77 return r; 78 } 79 80 protected void checkPos() throws IOException { 81 if(ro.getFilePointer() != pos) { 82 ro.seek(pos); 83 } 84 } 85 86 89 public void close() throws IOException { 90 ro = null; 91 } 92 93 public int available() throws IOException { 94 return (int)(ro.length() - pos); 95 } 96 97 public boolean markSupported() { 98 return true; 99 } 100 101 public void mark(int i) { 102 mark = pos; 103 } 104 105 public void reset() throws IOException { 106 if(mark == MARK_UNDEFINED) { 107 throw new IOException ("mark undefined"); 108 } 109 pos = mark; 110 } 111 112 public long skip(long l) throws IOException { 113 long skip = Math.min(ro.length() - pos, l); 114 pos += skip; 115 return skip; 116 } 117 } 118 | Popular Tags |