View Javadoc
1   /*
2    * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
3    * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4    *
5    * This code is free software; you can redistribute it and/or modify it
6    * under the terms of the GNU General Public License version 2 only, as
7    * published by the Free Software Foundation.  Oracle designates this
8    * particular file as subject to the "Classpath" exception as provided
9    * by Oracle in the LICENSE file that accompanied this code.
10   *
11   * This code is distributed in the hope that it will be useful, but WITHOUT
12   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14   * version 2 for more details (a copy is included in the LICENSE file that
15   * accompanied this code).
16   *
17   * You should have received a copy of the GNU General Public License version
18   * 2 along with this work; if not, write to the Free Software Foundation,
19   * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20   *
21   * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22   * or visit www.oracle.com if you need additional information or have any
23   * questions.
24   */
25  
26  package javax.imageio.stream;
27  
28  import java.io.Closeable;
29  import java.io.DataInput;
30  import java.io.IOException;
31  import java.nio.ByteOrder;
32  
33  /**
34   * A seekable input stream interface for use by
35   * <code>ImageReader</code>s.  Various input sources, such as
36   * <code>InputStream</code>s and <code>File</code>s,
37   * as well as future fast I/O sources may be "wrapped" by a suitable
38   * implementation of this interface for use by the Image I/O API.
39   *
40   * @see ImageInputStreamImpl
41   * @see FileImageInputStream
42   * @see FileCacheImageInputStream
43   * @see MemoryCacheImageInputStream
44   *
45   */
46  public interface ImageInputStream extends DataInput, Closeable {
47  
48      /**
49       * Sets the desired byte order for future reads of data values
50       * from this stream.  For example, the sequence of bytes '0x01
51       * 0x02 0x03 0x04' if read as a 4-byte integer would have the
52       * value '0x01020304' using network byte order and the value
53       * '0x04030201' under the reverse byte order.
54       *
55       * <p> The enumeration class <code>java.nio.ByteOrder</code> is
56       * used to specify the byte order.  A value of
57       * <code>ByteOrder.BIG_ENDIAN</code> specifies so-called
58       * big-endian or network byte order, in which the high-order byte
59       * comes first.  Motorola and Sparc processors store data in this
60       * format, while Intel processors store data in the reverse
61       * <code>ByteOrder.LITTLE_ENDIAN</code> order.
62       *
63       * <p> The byte order has no effect on the results returned from
64       * the <code>readBits</code> method (or the value written by
65       * <code>ImageOutputStream.writeBits</code>).
66       *
67       * @param byteOrder one of <code>ByteOrder.BIG_ENDIAN</code> or
68       * <code>java.nio.ByteOrder.LITTLE_ENDIAN</code>, indicating whether
69       * network byte order or its reverse will be used for future
70       * reads.
71       *
72       * @see java.nio.ByteOrder
73       * @see #getByteOrder
74       * @see #readBits(int)
75       */
76      void setByteOrder(ByteOrder byteOrder);
77  
78      /**
79       * Returns the byte order with which data values will be read from
80       * this stream as an instance of the
81       * <code>java.nio.ByteOrder</code> enumeration.
82       *
83       * @return one of <code>ByteOrder.BIG_ENDIAN</code> or
84       * <code>ByteOrder.LITTLE_ENDIAN</code>, indicating which byte
85       * order is being used.
86       *
87       * @see java.nio.ByteOrder
88       * @see #setByteOrder
89       */
90      ByteOrder getByteOrder();
91  
92      /**
93       * Reads a single byte from the stream and returns it as an
94       * integer between 0 and 255.  If the end of the stream is
95       * reached, -1 is returned.
96       *
97       * <p> The bit offset within the stream is reset to zero before
98       * the read occurs.
99       *
100      * @return a byte value from the stream, as an int, or -1 to
101      * indicate EOF.
102      *
103      * @exception IOException if an I/O error occurs.
104      */
105     int read() throws IOException;
106 
107     /**
108      * Reads up to <code>b.length</code> bytes from the stream, and
109      * stores them into <code>b</code> starting at index 0.  The
110      * number of bytes read is returned.  If no bytes can be read
111      * because the end of the stream has been reached, -1 is returned.
112      *
113      * <p> The bit offset within the stream is reset to zero before
114      * the read occurs.
115      *
116      * @param b an array of bytes to be written to.
117      *
118      * @return the number of bytes actually read, or <code>-1</code>
119      * to indicate EOF.
120      *
121      * @exception NullPointerException if <code>b</code> is
122      * <code>null</code>.
123      *
124      * @exception IOException if an I/O error occurs.
125      */
126     int read(byte[] b) throws IOException;
127 
128     /**
129      * Reads up to <code>len</code> bytes from the stream, and stores
130      * them into <code>b</code> starting at index <code>off</code>.
131      * The number of bytes read is returned.  If no bytes can be read
132      * because the end of the stream has been reached, <code>-1</code>
133      * is returned.
134      *
135      * <p> The bit offset within the stream is reset to zero before
136      * the read occurs.
137      *
138      * @param b an array of bytes to be written to.
139      * @param off the starting position within <code>b</code> to write to.
140      * @param len the maximum number of <code>byte</code>s to read.
141      *
142      * @return the number of bytes actually read, or <code>-1</code>
143      * to indicate EOF.
144      *
145      * @exception NullPointerException if <code>b</code> is
146      * <code>null</code>.
147      * @exception IndexOutOfBoundsException if <code>off</code> is
148      * negative, <code>len</code> is negative, or <code>off +
149      * len</code> is greater than <code>b.length</code>.
150      * @exception IOException if an I/O error occurs.
151      */
152     int read(byte[] b, int off, int len) throws IOException;
153 
154     /**
155      * Reads up to <code>len</code> bytes from the stream, and
156      * modifies the supplied <code>IIOByteBuffer</code> to indicate
157      * the byte array, offset, and length where the data may be found.
158      * The caller should not attempt to modify the data found in the
159      * <code>IIOByteBuffer</code>.
160      *
161      * <p> The bit offset within the stream is reset to zero before
162      * the read occurs.
163      *
164      * @param buf an IIOByteBuffer object to be modified.
165      * @param len the maximum number of <code>byte</code>s to read.
166      *
167      * @exception IndexOutOfBoundsException if <code>len</code> is
168      * negative.
169      * @exception NullPointerException if <code>buf</code> is
170      * <code>null</code>.
171      *
172      * @exception IOException if an I/O error occurs.
173      */
174     void readBytes(IIOByteBuffer buf, int len) throws IOException;
175 
176     /**
177      * Reads a byte from the stream and returns a <code>boolean</code>
178      * value of <code>true</code> if it is nonzero, <code>false</code>
179      * if it is zero.
180      *
181      * <p> The bit offset within the stream is reset to zero before
182      * the read occurs.
183      *
184      * @return a boolean value from the stream.
185      *
186      * @exception java.io.EOFException if the end of the stream is reached.
187      * @exception IOException if an I/O error occurs.
188      */
189     boolean readBoolean() throws IOException;
190 
191     /**
192      * Reads a byte from the stream and returns it as a
193      * <code>byte</code> value.  Byte values between <code>0x00</code>
194      * and <code>0x7f</code> represent integer values between
195      * <code>0</code> and <code>127</code>.  Values between
196      * <code>0x80</code> and <code>0xff</code> represent negative
197      * values from <code>-128</code> to <code>/1</code>.
198      *
199      * <p> The bit offset within the stream is reset to zero before
200      * the read occurs.
201      *
202      * @return a signed byte value from the stream.
203      *
204      * @exception java.io.EOFException if the end of the stream is reached.
205      * @exception IOException if an I/O error occurs.
206      */
207     byte readByte() throws IOException;
208 
209     /**
210      * Reads a byte from the stream, and (conceptually) converts it to
211      * an int, masks it with <code>0xff</code> in order to strip off
212      * any sign-extension bits, and returns it as a <code>byte</code>
213      * value.
214      *
215      * <p> Thus, byte values between <code>0x00</code> and
216      * <code>0x7f</code> are simply returned as integer values between
217      * <code>0</code> and <code>127</code>.  Values between
218      * <code>0x80</code> and <code>0xff</code>, which normally
219      * represent negative <code>byte</code>values, will be mapped into
220      * positive integers between <code>128</code> and
221      * <code>255</code>.
222      *
223      * <p> The bit offset within the stream is reset to zero before
224      * the read occurs.
225      *
226      * @return an unsigned byte value from the stream.
227      *
228      * @exception java.io.EOFException if the end of the stream is reached.
229      * @exception IOException if an I/O error occurs.
230      */
231     int readUnsignedByte() throws IOException;
232 
233     /**
234      * Reads two bytes from the stream, and (conceptually)
235      * concatenates them according to the current byte order, and
236      * returns the result as a <code>short</code> value.
237      *
238      * <p> The bit offset within the stream is reset to zero before
239      * the read occurs.
240      *
241      * @return a signed short value from the stream.
242      *
243      * @exception java.io.EOFException if the stream reaches the end before
244      * reading all the bytes.
245      * @exception IOException if an I/O error occurs.
246      *
247      * @see #getByteOrder
248      */
249     short readShort() throws IOException;
250 
251     /**
252      * Reads two bytes from the stream, and (conceptually)
253      * concatenates them according to the current byte order, converts
254      * the resulting value to an <code>int</code>, masks it with
255      * <code>0xffff</code> in order to strip off any sign-extension
256      * buts, and returns the result as an unsigned <code>int</code>
257      * value.
258      *
259      * <p> The bit offset within the stream is reset to zero before
260      * the read occurs.
261      *
262      * @return an unsigned short value from the stream, as an int.
263      *
264      * @exception java.io.EOFException if the stream reaches the end before
265      * reading all the bytes.
266      * @exception IOException if an I/O error occurs.
267      *
268      * @see #getByteOrder
269      */
270     int readUnsignedShort() throws IOException;
271 
272     /**
273      * Equivalent to <code>readUnsignedShort</code>, except that the
274      * result is returned using the <code>char</code> datatype.
275      *
276      * <p> The bit offset within the stream is reset to zero before
277      * the read occurs.
278      *
279      * @return an unsigned char value from the stream.
280      *
281      * @exception java.io.EOFException if the stream reaches the end before
282      * reading all the bytes.
283      * @exception IOException if an I/O error occurs.
284      *
285      * @see #readUnsignedShort
286      */
287     char readChar() throws IOException;
288 
289     /**
290      * Reads 4 bytes from the stream, and (conceptually) concatenates
291      * them according to the current byte order and returns the result
292      * as an <code>int</code>.
293      *
294      * <p> The bit offset within the stream is ignored and treated as
295      * though it were zero.
296      *
297      * @return a signed int value from the stream.
298      *
299      * @exception java.io.EOFException if the stream reaches the end before
300      * reading all the bytes.
301      * @exception IOException if an I/O error occurs.
302      *
303      * @see #getByteOrder
304      */
305     int readInt() throws IOException;
306 
307     /**
308      * Reads 4 bytes from the stream, and (conceptually) concatenates
309      * them according to the current byte order, converts the result
310      * to a long, masks it with <code>0xffffffffL</code> in order to
311      * strip off any sign-extension bits, and returns the result as an
312      * unsigned <code>long</code> value.
313      *
314      * <p> The bit offset within the stream is reset to zero before
315      * the read occurs.
316      *
317      * @return an unsigned int value from the stream, as a long.
318      *
319      * @exception java.io.EOFException if the stream reaches the end before
320      * reading all the bytes.
321      * @exception IOException if an I/O error occurs.
322      *
323      * @see #getByteOrder
324      */
325     long readUnsignedInt() throws IOException;
326 
327     /**
328      * Reads 8 bytes from the stream, and (conceptually) concatenates
329      * them according to the current byte order and returns the result
330      * as a <code>long</code>.
331      *
332      * <p> The bit offset within the stream is reset to zero before
333      * the read occurs.
334      *
335      * @return a signed long value from the stream.
336      *
337      * @exception java.io.EOFException if the stream reaches the end before
338      * reading all the bytes.
339      * @exception IOException if an I/O error occurs.
340      *
341      * @see #getByteOrder
342      */
343     long readLong() throws IOException;
344 
345     /**
346      * Reads 4 bytes from the stream, and (conceptually) concatenates
347      * them according to the current byte order and returns the result
348      * as a <code>float</code>.
349      *
350      * <p> The bit offset within the stream is reset to zero before
351      * the read occurs.
352      *
353      * @return a float value from the stream.
354      *
355      * @exception java.io.EOFException if the stream reaches the end before
356      * reading all the bytes.
357      * @exception IOException if an I/O error occurs.
358      *
359      * @see #getByteOrder
360      */
361     float readFloat() throws IOException;
362 
363     /**
364      * Reads 8 bytes from the stream, and (conceptually) concatenates
365      * them according to the current byte order and returns the result
366      * as a <code>double</code>.
367      *
368      * <p> The bit offset within the stream is reset to zero before
369      * the read occurs.
370      *
371      * @return a double value from the stream.
372      *
373      * @exception java.io.EOFException if the stream reaches the end before
374      * reading all the bytes.
375      * @exception IOException if an I/O error occurs.
376      *
377      * @see #getByteOrder
378      */
379     double readDouble() throws IOException;
380 
381     /**
382      * Reads the next line of text from the input stream.  It reads
383      * successive bytes, converting each byte separately into a
384      * character, until it encounters a line terminator or end of
385      * file; the characters read are then returned as a
386      * <code>String</code>. Note that because this method processes
387      * bytes, it does not support input of the full Unicode character
388      * set.
389      *
390      * <p> If end of file is encountered before even one byte can be
391      * read, then <code>null</code> is returned. Otherwise, each byte
392      * that is read is converted to type <code>char</code> by
393      * zero-extension. If the character <code>'\n'</code> is
394      * encountered, it is discarded and reading ceases. If the
395      * character <code>'\r'</code> is encountered, it is discarded
396      * and, if the following byte converts &#32;to the character
397      * <code>'\n'</code>, then that is discarded also; reading then
398      * ceases. If end of file is encountered before either of the
399      * characters <code>'\n'</code> and <code>'\r'</code> is
400      * encountered, reading ceases. Once reading has ceased, a
401      * <code>String</code> is returned that contains all the
402      * characters read and not discarded, taken in order.  Note that
403      * every character in this string will have a value less than
404      * <code>&#92;u0100</code>, that is, <code>(char)256</code>.
405      *
406      * <p> The bit offset within the stream is reset to zero before
407      * the read occurs.
408      *
409      * @return a String containing a line of text from the stream.
410      *
411      * @exception IOException if an I/O error occurs.
412      */
413     String readLine() throws IOException;
414 
415     /**
416      * Reads in a string that has been encoded using a
417      * <a href="../../../java/io/DataInput.html#modified-utf-8">modified
418      * UTF-8</a>
419      * format.  The general contract of <code>readUTF</code> is that
420      * it reads a representation of a Unicode character string encoded
421      * in modified UTF-8 format; this string of characters is
422      * then returned as a <code>String</code>.
423      *
424      * <p> First, two bytes are read and used to construct an unsigned
425      * 16-bit integer in the manner of the
426      * <code>readUnsignedShort</code> method, using network byte order
427      * (regardless of the current byte order setting). This integer
428      * value is called the <i>UTF length</i> and specifies the number
429      * of additional bytes to be read. These bytes are then converted
430      * to characters by considering them in groups. The length of each
431      * group is computed from the value of the first byte of the
432      * group. The byte following a group, if any, is the first byte of
433      * the next group.
434      *
435      * <p> If the first byte of a group matches the bit pattern
436      * <code>0xxxxxxx</code> (where <code>x</code> means "may be
437      * <code>0</code> or <code>1</code>"), then the group consists of
438      * just that byte. The byte is zero-extended to form a character.
439      *
440      * <p> If the first byte of a group matches the bit pattern
441      * <code>110xxxxx</code>, then the group consists of that byte
442      * <code>a</code> and a second byte <code>b</code>. If there is no
443      * byte <code>b</code> (because byte <code>a</code> was the last
444      * of the bytes to be read), or if byte <code>b</code> does not
445      * match the bit pattern <code>10xxxxxx</code>, then a
446      * <code>UTFDataFormatException</code> is thrown. Otherwise, the
447      * group is converted to the character:
448      *
449      * <p> <pre><code>
450      * (char)(((a&amp; 0x1F) &lt;&lt; 6) | (b &amp; 0x3F))
451      * </code></pre>
452      *
453      * If the first byte of a group matches the bit pattern
454      * <code>1110xxxx</code>, then the group consists of that byte
455      * <code>a</code> and two more bytes <code>b</code> and
456      * <code>c</code>.  If there is no byte <code>c</code> (because
457      * byte <code>a</code> was one of the last two of the bytes to be
458      * read), or either byte <code>b</code> or byte <code>c</code>
459      * does not match the bit pattern <code>10xxxxxx</code>, then a
460      * <code>UTFDataFormatException</code> is thrown. Otherwise, the
461      * group is converted to the character:
462      *
463      * <p> <pre><code>
464      * (char)(((a &amp; 0x0F) &lt;&lt; 12) | ((b &amp; 0x3F) &lt;&lt; 6) | (c &amp; 0x3F))
465      * </code></pre>
466      *
467      * If the first byte of a group matches the pattern
468      * <code>1111xxxx</code> or the pattern <code>10xxxxxx</code>,
469      * then a <code>UTFDataFormatException</code> is thrown.
470      *
471      * <p> If end of file is encountered at any time during this
472      * entire process, then an <code>java.io.EOFException</code> is thrown.
473      *
474      * <p> After every group has been converted to a character by this
475      * process, the characters are gathered, in the same order in
476      * which their corresponding groups were read from the input
477      * stream, to form a <code>String</code>, which is returned.
478      *
479      * <p> The current byte order setting is ignored.
480      *
481      * <p> The bit offset within the stream is reset to zero before
482      * the read occurs.
483      *
484      * <p><strong>Note:</strong> This method should not be used in
485      * the  implementation of image formats that use standard UTF-8,
486      * because  the modified UTF-8 used here is incompatible with
487      * standard UTF-8.
488      *
489      * @return a String read from the stream.
490      *
491      * @exception  java.io.EOFException  if this stream reaches the end
492      * before reading all the bytes.
493      * @exception  java.io.UTFDataFormatException if the bytes do not represent
494      * a valid modified UTF-8 encoding of a string.
495      * @exception IOException if an I/O error occurs.
496      */
497     String readUTF() throws IOException;
498 
499     /**
500      * Reads <code>len</code> bytes from the stream, and stores them
501      * into <code>b</code> starting at index <code>off</code>.
502      * If the end of the stream is reached, an <code>java.io.EOFException</code>
503      * will be thrown.
504      *
505      * <p> The bit offset within the stream is reset to zero before
506      * the read occurs.
507      *
508      * @param b an array of bytes to be written to.
509      * @param off the starting position within <code>b</code> to write to.
510      * @param len the maximum number of <code>byte</code>s to read.
511      *
512      * @exception IndexOutOfBoundsException if <code>off</code> is
513      * negative, <code>len</code> is negative, or <code>off +
514      * len</code> is greater than <code>b.length</code>.
515      * @exception NullPointerException if <code>b</code> is
516      * <code>null</code>.
517      * @exception java.io.EOFException if the stream reaches the end before
518      * reading all the bytes.
519      * @exception IOException if an I/O error occurs.
520      */
521     void readFully(byte[] b, int off, int len) throws IOException;
522 
523     /**
524      * Reads <code>b.length</code> bytes from the stream, and stores them
525      * into <code>b</code> starting at index <code>0</code>.
526      * If the end of the stream is reached, an <code>java.io.EOFException</code>
527      * will be thrown.
528      *
529      * <p> The bit offset within the stream is reset to zero before
530      * the read occurs.
531      *
532      * @param b an array of <code>byte</code>s.
533      *
534      * @exception NullPointerException if <code>b</code> is
535      * <code>null</code>.
536      * @exception java.io.EOFException if the stream reaches the end before
537      * reading all the bytes.
538      * @exception IOException if an I/O error occurs.
539      */
540     void readFully(byte[] b) throws IOException;
541 
542     /**
543      * Reads <code>len</code> shorts (signed 16-bit integers) from the
544      * stream according to the current byte order, and
545      * stores them into <code>s</code> starting at index
546      * <code>off</code>.  If the end of the stream is reached, an
547      * <code>java.io.EOFException</code> will be thrown.
548      *
549      * <p> The bit offset within the stream is reset to zero before
550      * the read occurs.
551      *
552      * @param s an array of shorts to be written to.
553      * @param off the starting position within <code>s</code> to write to.
554      * @param len the maximum number of <code>short</code>s to read.
555      *
556      * @exception IndexOutOfBoundsException if <code>off</code> is
557      * negative, <code>len</code> is negative, or <code>off +
558      * len</code> is greater than <code>s.length</code>.
559      * @exception NullPointerException if <code>s</code> is
560      * <code>null</code>.
561      * @exception java.io.EOFException if the stream reaches the end before
562      * reading all the bytes.
563      * @exception IOException if an I/O error occurs.
564      */
565     void readFully(short[] s, int off, int len) throws IOException;
566 
567     /**
568      * Reads <code>len</code> chars (unsigned 16-bit integers) from the
569      * stream according to the current byte order, and
570      * stores them into <code>c</code> starting at index
571      * <code>off</code>.  If the end of the stream is reached, an
572      * <code>java.io.EOFException</code> will be thrown.
573      *
574      * <p> The bit offset within the stream is reset to zero before
575      * the read occurs.
576      *
577      * @param c an array of chars to be written to.
578      * @param off the starting position within <code>c</code> to write to.
579      * @param len the maximum number of <code>char</code>s to read.
580      *
581      * @exception IndexOutOfBoundsException if <code>off</code> is
582      * negative, <code>len</code> is negative, or <code>off +
583      * len</code> is greater than <code>c.length</code>.
584      * @exception NullPointerException if <code>c</code> is
585      * <code>null</code>.
586      * @exception java.io.EOFException if the stream reaches the end before
587      * reading all the bytes.
588      * @exception IOException if an I/O error occurs.
589      */
590     void readFully(char[] c, int off, int len) throws IOException;
591 
592     /**
593      * Reads <code>len</code> ints (signed 32-bit integers) from the
594      * stream according to the current byte order, and
595      * stores them into <code>i</code> starting at index
596      * <code>off</code>.  If the end of the stream is reached, an
597      * <code>java.io.EOFException</code> will be thrown.
598      *
599      * <p> The bit offset within the stream is reset to zero before
600      * the read occurs.
601      *
602      * @param i an array of ints to be written to.
603      * @param off the starting position within <code>i</code> to write to.
604      * @param len the maximum number of <code>int</code>s to read.
605      *
606      * @exception IndexOutOfBoundsException if <code>off</code> is
607      * negative, <code>len</code> is negative, or <code>off +
608      * len</code> is greater than <code>i.length</code>.
609      * @exception NullPointerException if <code>i</code> is
610      * <code>null</code>.
611      * @exception java.io.EOFException if the stream reaches the end before
612      * reading all the bytes.
613      * @exception IOException if an I/O error occurs.
614      */
615     void readFully(int[] i, int off, int len) throws IOException;
616 
617     /**
618      * Reads <code>len</code> longs (signed 64-bit integers) from the
619      * stream according to the current byte order, and
620      * stores them into <code>l</code> starting at index
621      * <code>off</code>.  If the end of the stream is reached, an
622      * <code>java.io.EOFException</code> will be thrown.
623      *
624      * <p> The bit offset within the stream is reset to zero before
625      * the read occurs.
626      *
627      * @param l an array of longs to be written to.
628      * @param off the starting position within <code>l</code> to write to.
629      * @param len the maximum number of <code>long</code>s to read.
630      *
631      * @exception IndexOutOfBoundsException if <code>off</code> is
632      * negative, <code>len</code> is negative, or <code>off +
633      * len</code> is greater than <code>l.length</code>.
634      * @exception NullPointerException if <code>l</code> is
635      * <code>null</code>.
636      * @exception java.io.EOFException if the stream reaches the end before
637      * reading all the bytes.
638      * @exception IOException if an I/O error occurs.
639      */
640     void readFully(long[] l, int off, int len) throws IOException;
641 
642     /**
643      * Reads <code>len</code> floats (32-bit IEEE single-precision
644      * floats) from the stream according to the current byte order,
645      * and stores them into <code>f</code> starting at
646      * index <code>off</code>.  If the end of the stream is reached,
647      * an <code>java.io.EOFException</code> will be thrown.
648      *
649      * <p> The bit offset within the stream is reset to zero before
650      * the read occurs.
651      *
652      * @param f an array of floats to be written to.
653      * @param off the starting position within <code>f</code> to write to.
654      * @param len the maximum number of <code>float</code>s to read.
655      *
656      * @exception IndexOutOfBoundsException if <code>off</code> is
657      * negative, <code>len</code> is negative, or <code>off +
658      * len</code> is greater than <code>f.length</code>.
659      * @exception NullPointerException if <code>f</code> is
660      * <code>null</code>.
661      * @exception java.io.EOFException if the stream reaches the end before
662      * reading all the bytes.
663      * @exception IOException if an I/O error occurs.
664      */
665     void readFully(float[] f, int off, int len) throws IOException;
666 
667     /**
668      * Reads <code>len</code> doubles (64-bit IEEE double-precision
669      * floats) from the stream according to the current byte order,
670      * and stores them into <code>d</code> starting at
671      * index <code>off</code>.  If the end of the stream is reached,
672      * an <code>java.io.EOFException</code> will be thrown.
673      *
674      * <p> The bit offset within the stream is reset to zero before
675      * the read occurs.
676      *
677      * @param d an array of doubles to be written to.
678      * @param off the starting position within <code>d</code> to write to.
679      * @param len the maximum number of <code>double</code>s to read.
680      *
681      * @exception IndexOutOfBoundsException if <code>off</code> is
682      * negative, <code>len</code> is negative, or <code>off +
683      * len</code> is greater than <code>d.length</code>.
684      * @exception NullPointerException if <code>d</code> is
685      * <code>null</code>.
686      * @exception java.io.EOFException if the stream reaches the end before
687      * reading all the bytes.
688      * @exception IOException if an I/O error occurs.
689      */
690     void readFully(double[] d, int off, int len) throws IOException;
691 
692     /**
693      * Returns the current byte position of the stream.  The next read
694      * will take place starting at this offset.
695      *
696      * @return a long containing the position of the stream.
697      *
698      * @exception IOException if an I/O error occurs.
699      */
700     long getStreamPosition() throws IOException;
701 
702     /**
703      * Returns the current bit offset, as an integer between 0 and 7,
704      * inclusive.  The bit offset is updated implicitly by calls to
705      * the <code>readBits</code> method.  A value of 0 indicates the
706      * most-significant bit, and a value of 7 indicates the least
707      * significant bit, of the byte being read.
708      *
709      * <p> The bit offset is set to 0 when a stream is first
710      * opened, and is reset to 0 by calls to <code>seek</code>,
711      * <code>skipBytes</code>, or any <code>read</code> or
712      * <code>readFully</code> method.
713      *
714      * @return an <code>int</code> containing the bit offset between
715      * 0 and 7, inclusive.
716      *
717      * @exception IOException if an I/O error occurs.
718      *
719      * @see #setBitOffset
720      */
721     int getBitOffset() throws IOException;
722 
723     /**
724      * Sets the bit offset to an integer between 0 and 7, inclusive.
725      * The byte offset within the stream, as returned by
726      * <code>getStreamPosition</code>, is left unchanged.
727      * A value of 0 indicates the
728      * most-significant bit, and a value of 7 indicates the least
729      * significant bit, of the byte being read.
730      *
731      * @param bitOffset the desired offset, as an <code>int</code>
732      * between 0 and 7, inclusive.
733      *
734      * @exception IllegalArgumentException if <code>bitOffset</code>
735      * is not between 0 and 7, inclusive.
736      * @exception IOException if an I/O error occurs.
737      *
738      * @see #getBitOffset
739      */
740     void setBitOffset(int bitOffset) throws IOException;
741 
742     /**
743      * Reads a single bit from the stream and returns it as an
744      * <code>int</code> with the value <code>0</code> or
745      * <code>1</code>.  The bit offset is advanced by one and reduced
746      * modulo 8.
747      *
748      * @return an <code>int</code> containing the value <code>0</code>
749      * or <code>1</code>.
750      *
751      * @exception java.io.EOFException if the stream reaches the end before
752      * reading all the bits.
753      * @exception IOException if an I/O error occurs.
754      */
755     int readBit() throws IOException;
756 
757     /**
758      * Reads a bitstring from the stream and returns it as a
759      * <code>long</code>, with the first bit read becoming the most
760      * significant bit of the output.  The read starts within the byte
761      * indicated by <code>getStreamPosition</code>, at the bit given
762      * by <code>getBitOffset</code>.  The bit offset is advanced by
763      * <code>numBits</code> and reduced modulo 8.
764      *
765      * <p> The byte order of the stream has no effect on this
766      * method.  The return value of this method is constructed as
767      * though the bits were read one at a time, and shifted into
768      * the right side of the return value, as shown by the following
769      * pseudo-code:
770      *
771      * <pre>{@code
772      * long accum = 0L;
773      * for (int i = 0; i < numBits; i++) {
774      *   accum <<= 1; // Shift left one bit to make room
775      *   accum |= readBit();
776      * }
777      * }</pre>
778      *
779      * Note that the result of <code>readBits(32)</code> may thus not
780      * be equal to that of <code>readInt()</code> if a reverse network
781      * byte order is being used (i.e., <code>getByteOrder() ==
782      * false</code>).
783      *
784      * <p> If the end of the stream is encountered before all the bits
785      * have been read, an <code>java.io.EOFException</code> is thrown.
786      *
787      * @param numBits the number of bits to read, as an <code>int</code>
788      * between 0 and 64, inclusive.
789      * @return the bitstring, as a <code>long</code> with the last bit
790      * read stored in the least significant bit.
791      *
792      * @exception IllegalArgumentException if <code>numBits</code>
793      * is not between 0 and 64, inclusive.
794      * @exception java.io.EOFException if the stream reaches the end before
795      * reading all the bits.
796      * @exception IOException if an I/O error occurs.
797      */
798     long readBits(int numBits) throws IOException;
799 
800     /**
801      * Returns the total length of the stream, if known.  Otherwise,
802      * <code>-1</code> is returned.
803      *
804      * @return a <code>long</code> containing the length of the
805      * stream, if known, or else <code>-1</code>.
806      *
807      * @exception IOException if an I/O error occurs.
808      */
809     long length() throws IOException;
810 
811     /**
812      * Moves the stream position forward by a given number of bytes.  It
813      * is possible that this method will only be able to skip forward
814      * by a smaller number of bytes than requested, for example if the
815      * end of the stream is reached.  In all cases, the actual number
816      * of bytes skipped is returned.  The bit offset is set to zero
817      * prior to advancing the position.
818      *
819      * @param n an <code>int</code> containing the number of bytes to
820      * be skipped.
821      *
822      * @return an <code>int</code> representing the number of bytes skipped.
823      *
824      * @exception IOException if an I/O error occurs.
825      */
826     int skipBytes(int n) throws IOException;
827 
828     /**
829      * Moves the stream position forward by a given number of bytes.
830      * This method is identical to <code>skipBytes(int)</code> except
831      * that it allows for a larger skip distance.
832      *
833      * @param n a <code>long</code> containing the number of bytes to
834      * be skipped.
835      *
836      * @return a <code>long</code> representing the number of bytes
837      * skipped.
838      *
839      * @exception IOException if an I/O error occurs.
840      */
841     long skipBytes(long n) throws IOException;
842 
843     /**
844      * Sets the current stream position to the desired location.  The
845      * next read will occur at this location.  The bit offset is set
846      * to 0.
847      *
848      * <p> An <code>IndexOutOfBoundsException</code> will be thrown if
849      * <code>pos</code> is smaller than the flushed position (as
850      * returned by <code>getflushedPosition</code>).
851      *
852      * <p> It is legal to seek past the end of the file; an
853      * <code>java.io.EOFException</code> will be thrown only if a read is
854      * performed.
855      *
856      * @param pos a <code>long</code> containing the desired file
857      * pointer position.
858      *
859      * @exception IndexOutOfBoundsException if <code>pos</code> is smaller
860      * than the flushed position.
861      * @exception IOException if any other I/O error occurs.
862      */
863     void seek(long pos) throws IOException;
864 
865     /**
866      * Marks a position in the stream to be returned to by a
867      * subsequent call to <code>reset</code>.  Unlike a standard
868      * <code>InputStream</code>, all <code>ImageInputStream</code>s
869      * support marking.  Additionally, calls to <code>mark</code> and
870      * <code>reset</code> may be nested arbitrarily.
871      *
872      * <p> Unlike the <code>mark</code> methods declared by the
873      * <code>Reader</code> and <code>InputStream</code> interfaces, no
874      * <code>readLimit</code> parameter is used.  An arbitrary amount
875      * of data may be read following the call to <code>mark</code>.
876      *
877      * <p> The bit position used by the <code>readBits</code> method
878      * is saved and restored by each pair of calls to
879      * <code>mark</code> and <code>reset</code>.
880      *
881      * <p> Note that it is valid for an <code>ImageReader</code> to call
882      * <code>flushBefore</code> as part of a read operation.
883      * Therefore, if an application calls <code>mark</code> prior to
884      * passing that stream to an <code>ImageReader</code>, the application
885      * should not assume that the marked position will remain valid after
886      * the read operation has completed.
887      */
888     void mark();
889 
890     /**
891      * Returns the stream pointer to its previous position, including
892      * the bit offset, at the time of the most recent unmatched call
893      * to <code>mark</code>.
894      *
895      * <p> Calls to <code>reset</code> without a corresponding call
896      * to <code>mark</code> have no effect.
897      *
898      * <p> An <code>IOException</code> will be thrown if the previous
899      * marked position lies in the discarded portion of the stream.
900      *
901      * @exception IOException if an I/O error occurs.
902      */
903     void reset() throws IOException;
904 
905     /**
906      * Discards the initial portion of the stream prior to the
907      * indicated position.  Attempting to seek to an offset within the
908      * flushed portion of the stream will result in an
909      * <code>IndexOutOfBoundsException</code>.
910      *
911      * <p> Calling <code>flushBefore</code> may allow classes
912      * implementing this interface to free up resources such as memory
913      * or disk space that are being used to store data from the
914      * stream.
915      *
916      * @param pos a <code>long</code> containing the length of the
917      * stream prefix that may be flushed.
918      *
919      * @exception IndexOutOfBoundsException if <code>pos</code> lies
920      * in the flushed portion of the stream or past the current stream
921      * position.
922      * @exception IOException if an I/O error occurs.
923      */
924     void flushBefore(long pos) throws IOException;
925 
926     /**
927      * Discards the initial position of the stream prior to the current
928      * stream position.  Equivalent to
929      * <code>flushBefore(getStreamPosition())</code>.
930      *
931      * @exception IOException if an I/O error occurs.
932      */
933     void flush() throws IOException;
934 
935     /**
936      * Returns the earliest position in the stream to which seeking
937      * may be performed.  The returned value will be the maximum of
938      * all values passed into previous calls to
939      * <code>flushBefore</code>.
940      *
941      * @return the earliest legal position for seeking, as a
942      * <code>long</code>.
943      */
944     long getFlushedPosition();
945 
946     /**
947      * Returns <code>true</code> if this <code>ImageInputStream</code>
948      * caches data itself in order to allow seeking backwards.
949      * Applications may consult this in order to decide how frequently,
950      * or whether, to flush in order to conserve cache resources.
951      *
952      * @return <code>true</code> if this <code>ImageInputStream</code>
953      * caches data.
954      *
955      * @see #isCachedMemory
956      * @see #isCachedFile
957      */
958     boolean isCached();
959 
960     /**
961      * Returns <code>true</code> if this <code>ImageInputStream</code>
962      * caches data itself in order to allow seeking backwards, and
963      * the cache is kept in main memory.  Applications may consult
964      * this in order to decide how frequently, or whether, to flush
965      * in order to conserve cache resources.
966      *
967      * @return <code>true</code> if this <code>ImageInputStream</code>
968      * caches data in main memory.
969      *
970      * @see #isCached
971      * @see #isCachedFile
972      */
973     boolean isCachedMemory();
974 
975     /**
976      * Returns <code>true</code> if this <code>ImageInputStream</code>
977      * caches data itself in order to allow seeking backwards, and
978      * the cache is kept in a temporary file.  Applications may consult
979      * this in order to decide how frequently, or whether, to flush
980      * in order to conserve cache resources.
981      *
982      * @return <code>true</code> if this <code>ImageInputStream</code>
983      * caches data in a temporary file.
984      *
985      * @see #isCached
986      * @see #isCachedMemory
987      */
988     boolean isCachedFile();
989 
990     /**
991      * Closes the stream.  Attempts to access a stream that has been
992      * closed may result in <code>IOException</code>s or incorrect
993      * behavior.  Calling this method may allow classes implementing
994      * this interface to release resources associated with the stream
995      * such as memory, disk space, or file descriptors.
996      *
997      * @exception IOException if an I/O error occurs.
998      */
999     void close() throws IOException;
1000 }