001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.commons.io.input;
018
019 import java.io.DataInput;
020 import java.io.EOFException;
021 import java.io.IOException;
022 import java.io.InputStream;
023
024 import org.apache.commons.io.EndianUtils;
025
026 /**
027 * DataInput for systems relying on little endian data formats.
028 * When read, values will be changed from little endian to big
029 * endian formats for internal usage.
030 * <p>
031 * <b>Origin of code: </b>Avalon Excalibur (IO)
032 *
033 * @version CVS $Revision: 1302050 $
034 */
035 public class SwappedDataInputStream extends ProxyInputStream
036 implements DataInput
037 {
038
039 /**
040 * Constructs a SwappedDataInputStream.
041 *
042 * @param input InputStream to read from
043 */
044 public SwappedDataInputStream( InputStream input )
045 {
046 super( input );
047 }
048
049 /**
050 * Return <code>{@link #readByte()} != 0</code>
051 * @return false if the byte read is zero, otherwise true
052 * @throws IOException if an I/O error occurs
053 * @throws EOFException if an end of file is reached unexpectedly
054 */
055 public boolean readBoolean()
056 throws IOException, EOFException
057 {
058 return 0 != readByte();
059 }
060
061 /**
062 * Invokes the delegate's <code>read()</code> method.
063 * @return the byte read or -1 if the end of stream
064 * @throws IOException if an I/O error occurs
065 * @throws EOFException if an end of file is reached unexpectedly
066 */
067 public byte readByte()
068 throws IOException, EOFException
069 {
070 return (byte)in.read();
071 }
072
073 /**
074 * Reads a character delegating to {@link #readShort()}.
075 * @return the byte read or -1 if the end of stream
076 * @throws IOException if an I/O error occurs
077 * @throws EOFException if an end of file is reached unexpectedly
078 */
079 public char readChar()
080 throws IOException, EOFException
081 {
082 return (char)readShort();
083 }
084
085 /**
086 * Delegates to {@link EndianUtils#readSwappedDouble(InputStream)}.
087 * @return the read long
088 * @throws IOException if an I/O error occurs
089 * @throws EOFException if an end of file is reached unexpectedly
090 */
091 public double readDouble()
092 throws IOException, EOFException
093 {
094 return EndianUtils.readSwappedDouble( in );
095 }
096
097 /**
098 * Delegates to {@link EndianUtils#readSwappedFloat(InputStream)}.
099 * @return the read long
100 * @throws IOException if an I/O error occurs
101 * @throws EOFException if an end of file is reached unexpectedly
102 */
103 public float readFloat()
104 throws IOException, EOFException
105 {
106 return EndianUtils.readSwappedFloat( in );
107 }
108
109 /**
110 * Invokes the delegate's <code>read(byte[] data, int, int)</code> method.
111 *
112 * @param data the buffer to read the bytes into
113 * @throws EOFException if an end of file is reached unexpectedly
114 * @throws IOException if an I/O error occurs
115 */
116 public void readFully( byte[] data )
117 throws IOException, EOFException
118 {
119 readFully( data, 0, data.length );
120 }
121
122
123 /**
124 * Invokes the delegate's <code>read(byte[] data, int, int)</code> method.
125 *
126 * @param data the buffer to read the bytes into
127 * @param offset The start offset
128 * @param length The number of bytes to read
129 * @throws EOFException if an end of file is reached unexpectedly
130 * @throws IOException if an I/O error occurs
131 */
132 public void readFully( byte[] data, int offset, int length )
133 throws IOException, EOFException
134 {
135 int remaining = length;
136
137 while( remaining > 0 )
138 {
139 int location = offset + length - remaining;
140 int count = read( data, location, remaining );
141
142 if( -1 == count )
143 {
144 throw new EOFException();
145 }
146
147 remaining -= count;
148 }
149 }
150
151 /**
152 * Delegates to {@link EndianUtils#readSwappedInteger(InputStream)}.
153 * @return the read long
154 * @throws EOFException if an end of file is reached unexpectedly
155 * @throws IOException if an I/O error occurs
156 */
157 public int readInt()
158 throws IOException, EOFException
159 {
160 return EndianUtils.readSwappedInteger( in );
161 }
162
163 /**
164 * Not currently supported - throws {@link UnsupportedOperationException}.
165 * @return the line read
166 * @throws EOFException if an end of file is reached unexpectedly
167 * @throws IOException if an I/O error occurs
168 */
169 public String readLine()
170 throws IOException, EOFException
171 {
172 throw new UnsupportedOperationException(
173 "Operation not supported: readLine()" );
174 }
175
176 /**
177 * Delegates to {@link EndianUtils#readSwappedLong(InputStream)}.
178 * @return the read long
179 * @throws EOFException if an end of file is reached unexpectedly
180 * @throws IOException if an I/O error occurs
181 */
182 public long readLong()
183 throws IOException, EOFException
184 {
185 return EndianUtils.readSwappedLong( in );
186 }
187
188 /**
189 * Delegates to {@link EndianUtils#readSwappedShort(InputStream)}.
190 * @return the read long
191 * @throws EOFException if an end of file is reached unexpectedly
192 * @throws IOException if an I/O error occurs
193 */
194 public short readShort()
195 throws IOException, EOFException
196 {
197 return EndianUtils.readSwappedShort( in );
198 }
199
200 /**
201 * Invokes the delegate's <code>read()</code> method.
202 * @return the byte read or -1 if the end of stream
203 * @throws EOFException if an end of file is reached unexpectedly
204 * @throws IOException if an I/O error occurs
205 */
206 public int readUnsignedByte()
207 throws IOException, EOFException
208 {
209 return in.read();
210 }
211
212 /**
213 * Delegates to {@link EndianUtils#readSwappedUnsignedShort(InputStream)}.
214 * @return the read long
215 * @throws EOFException if an end of file is reached unexpectedly
216 * @throws IOException if an I/O error occurs
217 */
218 public int readUnsignedShort()
219 throws IOException, EOFException
220 {
221 return EndianUtils.readSwappedUnsignedShort( in );
222 }
223
224 /**
225 * Not currently supported - throws {@link UnsupportedOperationException}.
226 * @return UTF String read
227 * @throws EOFException if an end of file is reached unexpectedly
228 * @throws IOException if an I/O error occurs
229 */
230 public String readUTF()
231 throws IOException, EOFException
232 {
233 throw new UnsupportedOperationException(
234 "Operation not supported: readUTF()" );
235 }
236
237 /**
238 * Invokes the delegate's <code>skip(int)</code> method.
239 * @param count the number of bytes to skip
240 * @return the number of bytes to skipped or -1 if the end of stream
241 * @throws EOFException if an end of file is reached unexpectedly
242 * @throws IOException if an I/O error occurs
243 */
244 public int skipBytes( int count )
245 throws IOException, EOFException
246 {
247 return (int)in.skip( count );
248 }
249
250 }