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 * @author <a href="mailto:peter@apache.org">Peter Donald</a>
034 * @version CVS $Revision: 995160 $ $Date: 2010-09-08 13:15:52 -0400 (Wed, 08 Sep 2010) $
035 */
036 public class SwappedDataInputStream extends ProxyInputStream
037 implements DataInput
038 {
039
040 /**
041 * Constructs a SwappedDataInputStream.
042 *
043 * @param input InputStream to read from
044 */
045 public SwappedDataInputStream( InputStream input )
046 {
047 super( input );
048 }
049
050 /**
051 * Return <code>{@link #readByte()} != 0</code>
052 * @return false if the byte read is zero, otherwise true
053 * @throws IOException if an I/O error occurs
054 * @throws EOFException if an end of file is reached unexpectedly
055 */
056 public boolean readBoolean()
057 throws IOException, EOFException
058 {
059 return ( 0 != readByte() );
060 }
061
062 /**
063 * Invokes the delegate's <code>read()</code> method.
064 * @return the byte read or -1 if the end of stream
065 * @throws IOException if an I/O error occurs
066 * @throws EOFException if an end of file is reached unexpectedly
067 */
068 public byte readByte()
069 throws IOException, EOFException
070 {
071 return (byte)in.read();
072 }
073
074 /**
075 * Reads a character delegating to {@link #readShort()}.
076 * @return the byte read or -1 if the end of stream
077 * @throws IOException if an I/O error occurs
078 * @throws EOFException if an end of file is reached unexpectedly
079 */
080 public char readChar()
081 throws IOException, EOFException
082 {
083 return (char)readShort();
084 }
085
086 /**
087 * Delegates to {@link EndianUtils#readSwappedDouble(InputStream)}.
088 * @return the read long
089 * @throws IOException if an I/O error occurs
090 * @throws EOFException if an end of file is reached unexpectedly
091 */
092 public double readDouble()
093 throws IOException, EOFException
094 {
095 return EndianUtils.readSwappedDouble( in );
096 }
097
098 /**
099 * 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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
245 public int skipBytes( int count )
246 throws IOException, EOFException
247 {
248 return (int)in.skip( count );
249 }
250
251 }