KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > go > trove > io > FastBufferedInputStream


1 /*
2  * @(#)BufferedInputStream.java 1.41 00/02/02
3  *
4  * Copyright 1994-2000 Sun Microsystems, Inc. All Rights Reserved.
5  *
6  * This software is the proprietary information of Sun Microsystems, Inc.
7  * Use is subject to license terms.
8  *
9  */

10
11 package com.go.trove.io;
12
13 import java.io.*;
14
15 /**
16  * FastBufferedInputStream is just a slightly modified version of
17  * {@link java.io.BufferedInputStream}. The synchronization is gone, and so
18  * reads are faster. Refer to the original BufferedInputStream for
19  * documentation.
20  */

21 /* @author Arthur van Hoff
22  * @version 1.41, 02/02/00
23  * @since JDK1.0
24  */

25 public class FastBufferedInputStream extends FilterInputStream {
26     // These fields have been renamed and made private. In the original, they
27
// are protected.
28
private byte[] mBuffer;
29     private int mCount;
30     private int mPos;
31     private int mMarkPos = -1;
32     private int mMarkLimit;
33     
34     private void ensureOpen() throws IOException {
35         if (in == null) {
36             throw new IOException("Stream closed");
37         }
38     }
39
40     public FastBufferedInputStream(InputStream in) {
41         this(in, 2048);
42     }
43
44     public FastBufferedInputStream(InputStream in, int size) {
45         super(in);
46         if (size <= 0) {
47             throw new IllegalArgumentException JavaDoc("Buffer size <= 0");
48         }
49         mBuffer = new byte[size];
50     }
51
52     private void fill() throws IOException {
53         if (mMarkPos < 0) {
54             mPos = 0;
55         }
56         else if (mPos >= mBuffer.length) {
57             if (mMarkPos > 0) {
58                 int sz = mPos - mMarkPos;
59                 System.arraycopy(mBuffer, mMarkPos, mBuffer, 0, sz);
60                 mPos = sz;
61                 mMarkPos = 0;
62             }
63             else if (mBuffer.length >= mMarkLimit) {
64                 mMarkPos = -1;
65                 mPos = 0;
66             }
67             else {
68                 int nsz = mPos * 2;
69                 if (nsz > mMarkLimit) {
70                     nsz = mMarkLimit;
71                 }
72                 byte nbuf[] = new byte[nsz];
73                 System.arraycopy(mBuffer, 0, nbuf, 0, mPos);
74                 mBuffer = nbuf;
75             }
76         }
77         mCount = mPos;
78         int n = in.read(mBuffer, mPos, mBuffer.length - mPos);
79         if (n > 0) {
80             mCount = n + mPos;
81         }
82     }
83     
84     public int read() throws IOException {
85         ensureOpen();
86         if (mPos >= mCount) {
87             fill();
88             if (mPos >= mCount) {
89                 return -1;
90             }
91         }
92         return mBuffer[mPos++] & 0xff;
93     }
94     
95     private int read1(byte[] b, int off, int len) throws IOException {
96         int avail = mCount - mPos;
97         if (avail <= 0) {
98             if (len >= mBuffer.length && mMarkPos < 0) {
99                 return in.read(b, off, len);
100             }
101             fill();
102             avail = mCount - mPos;
103             if (avail <= 0) {
104                 return -1;
105             }
106         }
107         int cnt = (avail < len) ? avail : len;
108         System.arraycopy(mBuffer, mPos, b, off, cnt);
109         mPos += cnt;
110         return cnt;
111     }
112     
113     public int read(byte b[], int off, int len) throws IOException {
114         ensureOpen();
115         if ((off | len | (off + len) | (b.length - (off + len))) < 0) {
116             throw new IndexOutOfBoundsException JavaDoc();
117         }
118         else if (len == 0) {
119             return 0;
120         }
121         
122         int n = read1(b, off, len);
123         if (n <= 0) {
124             return n;
125         }
126         while ((n < len) && (in.available() > 0)) {
127             int n1 = read1(b, off + n, len - n);
128             if (n1 <= 0) {
129                 break;
130             }
131             n += n1;
132         }
133         return n;
134     }
135
136     public long skip(long n) throws IOException {
137         ensureOpen();
138         if (n <= 0) {
139             return 0;
140         }
141         long avail = mCount - mPos;
142         
143         if (avail <= 0) {
144             if (mMarkPos <0) {
145                 return in.skip(n);
146             }
147             
148             fill();
149             avail = mCount - mPos;
150             if (avail <= 0) {
151                 return 0;
152             }
153         }
154         
155         long skipped = (avail < n) ? avail : n;
156         mPos += skipped;
157         return skipped;
158     }
159     
160     public int available() throws IOException {
161         ensureOpen();
162         return (mCount - mPos) + in.available();
163     }
164     
165     public void mark(int readlimit) {
166         mMarkLimit = readlimit;
167         mMarkPos = mPos;
168     }
169     
170     public void reset() throws IOException {
171         ensureOpen();
172         if (mMarkPos < 0) {
173             throw new IOException("Resetting to invalid mark");
174         }
175         mPos = mMarkPos;
176     }
177
178     public boolean markSupported() {
179         return true;
180     }
181
182     public void close() throws IOException {
183         if (in != null) {
184             in.close();
185             in = null;
186             mBuffer = null;
187         }
188     }
189 }
190
Popular Tags