• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one or more
3  * contributor license agreements.  See the NOTICE file distributed with
4  * this work for additional information regarding copyright ownership.
5  * The ASF licenses this file to You under the Apache License, Version 2.0
6  * (the "License"); you may not use this file except in compliance with
7  * the License.  You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 package org.apache.commons.io.input;
18 
19 import java.io.DataInput;
20 import java.io.EOFException;
21 import java.io.IOException;
22 import java.io.InputStream;
23 
24 import org.apache.commons.io.EndianUtils;
25 
26 /**
27  * DataInput for systems relying on little endian data formats.
28  * When read, values will be changed from little endian to big
29  * endian formats for internal usage.
30  * <p>
31  * <b>Origin of code: </b>Avalon Excalibur (IO)
32  *
33  * @author <a href="mailto:peter@apache.org">Peter Donald</a>
34  * @version CVS $Revision: 610010 $ $Date: 2008-01-08 14:50:59 +0000 (Tue, 08 Jan 2008) $
35  */
36 public class SwappedDataInputStream extends ProxyInputStream
37     implements DataInput
38 {
39 
40     /**
41      * Constructs a SwappedDataInputStream.
42      *
43      * @param input InputStream to read from
44      */
SwappedDataInputStream( InputStream input )45     public SwappedDataInputStream( InputStream input )
46     {
47         super( input );
48     }
49 
50     /**
51      * Return <code>{@link #readByte()} == 0</code>
52      * @return the true if the byte read is zero, otherwise false
53      * @throws IOException if an I/O error occurs
54      * @throws EOFException if an end of file is reached unexpectedly
55      */
readBoolean()56     public boolean readBoolean()
57         throws IOException, EOFException
58     {
59         return ( 0 == readByte() );
60     }
61 
62     /**
63      * Invokes the delegate's <code>read()</code> method.
64      * @return the byte read or -1 if the end of stream
65      * @throws IOException if an I/O error occurs
66      * @throws EOFException if an end of file is reached unexpectedly
67      */
readByte()68     public byte readByte()
69         throws IOException, EOFException
70     {
71         return (byte)in.read();
72     }
73 
74     /**
75      * Reads a character delegating to {@link #readShort()}.
76      * @return the byte read or -1 if the end of stream
77      * @throws IOException if an I/O error occurs
78      * @throws EOFException if an end of file is reached unexpectedly
79      */
readChar()80     public char readChar()
81         throws IOException, EOFException
82     {
83         return (char)readShort();
84     }
85 
86     /**
87      * Delegates to {@link EndianUtils#readSwappedDouble(InputStream)}.
88      * @return the read long
89      * @throws IOException if an I/O error occurs
90      * @throws EOFException if an end of file is reached unexpectedly
91      */
readDouble()92     public double readDouble()
93         throws IOException, EOFException
94     {
95         return EndianUtils.readSwappedDouble( in );
96     }
97 
98     /**
99      * Delegates to {@link EndianUtils#readSwappedFloat(InputStream)}.
100      * @return the read long
101      * @throws IOException if an I/O error occurs
102      * @throws EOFException if an end of file is reached unexpectedly
103      */
readFloat()104     public float readFloat()
105         throws IOException, EOFException
106     {
107         return EndianUtils.readSwappedFloat( in );
108     }
109 
110     /**
111      * Invokes the delegate's <code>read(byte[] data, int, int)</code> method.
112      *
113      * @param data the buffer to read the bytes into
114      * @throws EOFException if an end of file is reached unexpectedly
115      * @throws IOException if an I/O error occurs
116      */
readFully( byte[] data )117     public void readFully( byte[] data )
118         throws IOException, EOFException
119     {
120         readFully( data, 0, data.length );
121     }
122 
123 
124     /**
125      * Invokes the delegate's <code>read(byte[] data, int, int)</code> method.
126      *
127      * @param data the buffer to read the bytes into
128      * @param offset The start offset
129      * @param length The number of bytes to read
130      * @throws EOFException if an end of file is reached unexpectedly
131      * @throws IOException if an I/O error occurs
132      */
readFully( byte[] data, int offset, int length )133     public void readFully( byte[] data, int offset, int length )
134         throws IOException, EOFException
135     {
136         int remaining = length;
137 
138         while( remaining > 0 )
139         {
140             int location = offset + ( length - remaining );
141             int count = read( data, location, remaining );
142 
143             if( -1 == count )
144             {
145                 throw new EOFException();
146             }
147 
148             remaining -= count;
149         }
150     }
151 
152     /**
153      * Delegates to {@link EndianUtils#readSwappedInteger(InputStream)}.
154      * @return the read long
155      * @throws EOFException if an end of file is reached unexpectedly
156      * @throws IOException if an I/O error occurs
157      */
readInt()158     public int readInt()
159         throws IOException, EOFException
160     {
161         return EndianUtils.readSwappedInteger( in );
162     }
163 
164     /**
165      * Not currently supported - throws {@link UnsupportedOperationException}.
166      * @return the line read
167      * @throws EOFException if an end of file is reached unexpectedly
168      * @throws IOException if an I/O error occurs
169      */
readLine()170     public String readLine()
171         throws IOException, EOFException
172     {
173         throw new UnsupportedOperationException(
174                 "Operation not supported: readLine()" );
175     }
176 
177     /**
178      * Delegates to {@link EndianUtils#readSwappedLong(InputStream)}.
179      * @return the read long
180      * @throws EOFException if an end of file is reached unexpectedly
181      * @throws IOException if an I/O error occurs
182      */
readLong()183     public long readLong()
184         throws IOException, EOFException
185     {
186         return EndianUtils.readSwappedLong( in );
187     }
188 
189     /**
190      * Delegates to {@link EndianUtils#readSwappedShort(InputStream)}.
191      * @return the read long
192      * @throws EOFException if an end of file is reached unexpectedly
193      * @throws IOException if an I/O error occurs
194      */
readShort()195     public short readShort()
196         throws IOException, EOFException
197     {
198         return EndianUtils.readSwappedShort( in );
199     }
200 
201     /**
202      * Invokes the delegate's <code>read()</code> method.
203      * @return the byte read or -1 if the end of stream
204      * @throws EOFException if an end of file is reached unexpectedly
205      * @throws IOException if an I/O error occurs
206      */
readUnsignedByte()207     public int readUnsignedByte()
208         throws IOException, EOFException
209     {
210         return in.read();
211     }
212 
213     /**
214      * Delegates to {@link EndianUtils#readSwappedUnsignedShort(InputStream)}.
215      * @return the read long
216      * @throws EOFException if an end of file is reached unexpectedly
217      * @throws IOException if an I/O error occurs
218      */
readUnsignedShort()219     public int readUnsignedShort()
220         throws IOException, EOFException
221     {
222         return EndianUtils.readSwappedUnsignedShort( in );
223     }
224 
225     /**
226      * Not currently supported - throws {@link UnsupportedOperationException}.
227      * @return UTF String read
228      * @throws EOFException if an end of file is reached unexpectedly
229      * @throws IOException if an I/O error occurs
230      */
readUTF()231     public String readUTF()
232         throws IOException, EOFException
233     {
234         throw new UnsupportedOperationException(
235                 "Operation not supported: readUTF()" );
236     }
237 
238     /**
239      * Invokes the delegate's <code>skip(int)</code> method.
240      * @param count the number of bytes to skip
241      * @return the number of bytes to skipped or -1 if the end of stream
242      * @throws EOFException if an end of file is reached unexpectedly
243      * @throws IOException if an I/O error occurs
244      */
skipBytes( int count )245     public int skipBytes( int count )
246         throws IOException, EOFException
247     {
248         return (int)in.skip( count );
249     }
250 
251 }
252