blob: db5ed8cd6111b0f4d0d3999f5715bd2959ac7325 [file] [log] [blame]
/*
* Copyright (c) 2014-2021 by Wen Yu
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the Eclipse
* Public License, v. 2.0 are satisfied: GNU General Public License, version 2
* or any later version.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
*/
package pixy.io;
import java.io.ByteArrayOutputStream;
import java.io.EOFException;
import java.io.InputStream;
import java.io.IOException;
import java.io.OutputStream;
/**
* General purpose IO helper class
*
* @author Wen Yu, yuwen_66@yahoo.com
* @version 1.0 10/12/2012
*/
public class IOUtils {
//
public static final short LITTLE_ENDIAN = 0x4949;//II Intel
public static final short BIG_ENDIAN = 0x4d4d;//MM Motorola
public static void close(InputStream is) throws IOException {
is.close();
}
public static void close(OutputStream os) throws IOException {
os.close();
}
public static byte[] inputStreamToByteArray(InputStream is) throws IOException {
ByteArrayOutputStream bout = new ByteArrayOutputStream(4096);
byte[] buf = new byte[4096];
int len = 0;
while((len = is.read(buf)) != -1) {
bout.write(buf, 0, len);
}
bout.close();
return bout.toByteArray();
}
public static int read(InputStream is) throws IOException {
return is.read();
}
public static int read(InputStream is, byte[] bytes) throws IOException {
return is.read(bytes);
}
public static int read(InputStream is, byte[] bytes, int off, int len) throws IOException {
return is.read(bytes, off, len);
}
public static double readDouble(InputStream is) throws IOException {
return Double.longBitsToDouble(readLong(is));
}
public static double readDoubleMM(InputStream is) throws IOException {
return Double.longBitsToDouble(readLongMM(is));
}
public static float readFloat(InputStream is) throws IOException {
return Float.intBitsToFloat(readInt(is));
}
public static float readFloatMM(InputStream is) throws IOException {
return Float.intBitsToFloat(readIntMM(is));
}
public static byte[] readFully(InputStream is, int bufLen) throws IOException {
ByteArrayOutputStream bout = new ByteArrayOutputStream(bufLen);
byte[] buf = new byte[bufLen];
int count = is.read(buf);
while (count > 0) {
bout.write(buf, 0, count);
count = is.read(buf);
}
return bout.toByteArray();
}
public static void readFully(InputStream is, byte b[]) throws IOException {
readFully(is, b, 0, b.length);
}
public static void readFully(InputStream is, byte[] b, int off, int len) throws IOException {
if (len < 0)
throw new IndexOutOfBoundsException();
int n = 0;
while (n < len) {
int count = is.read(b, off + n, len - n);
if (count < 0)
throw new EOFException();
n += count;
}
}
public static int readInt(byte[] buf, int start_idx) {
return ((buf[start_idx++]&0xff)|((buf[start_idx++]&0xff)<<8)|
((buf[start_idx++]&0xff)<<16)|((buf[start_idx++]&0xff)<<24));
}
public static int readInt(InputStream is) throws IOException {
byte[] buf = new byte[4];
readFully(is, buf);
return (((buf[3]&0xff)<<24)|((buf[2]&0xff)<<16)|((buf[1]&0xff)<<8)|(buf[0]&0xff));
}
public static int readIntMM(byte[] buf, int start_idx) {
return (((buf[start_idx++]&0xff)<<24)|((buf[start_idx++]&0xff)<<16)|
((buf[start_idx++]&0xff)<<8)|(buf[start_idx++]&0xff));
}
public static int readIntMM(InputStream is) throws IOException {
byte[] buf = new byte[4];
readFully(is, buf);
return (((buf[0]&0xff)<<24)|((buf[1]&0xff)<<16)|
((buf[2]&0xff)<<8)|(buf[3]&0xff));
}
public static long readLong(byte[] buf, int start_idx) {
return ((buf[start_idx++]&0xffL)|(((buf[start_idx++]&0xffL)<<8)|((buf[start_idx++]&0xffL)<<16)|
((buf[start_idx++]&0xffL)<<24)|((buf[start_idx++]&0xffL)<<32)|((buf[start_idx++]&0xffL)<<40)|
((buf[start_idx++]&0xffL)<<48)|(buf[start_idx]&0xffL)<<56));
}
public static long readLong(InputStream is) throws IOException {
byte[] buf = new byte[8];
readFully(is, buf);
return (((buf[7]&0xffL)<<56)|((buf[6]&0xffL)<<48)|
((buf[5]&0xffL)<<40)|((buf[4]&0xffL)<<32)|((buf[3]&0xffL)<<24)|
((buf[2]&0xffL)<<16)|((buf[1]&0xffL)<<8)|(buf[0]&0xffL));
}
public static long readLongMM(byte[] buf, int start_idx) {
return (((buf[start_idx++]&0xffL)<<56)|((buf[start_idx++]&0xffL)<<48)|
((buf[start_idx++]&0xffL)<<40)|((buf[start_idx++]&0xffL)<<32)|((buf[start_idx++]&0xffL)<<24)|
((buf[start_idx++]&0xffL)<<16)|((buf[start_idx++]&0xffL)<<8)|(buf[start_idx]&0xffL));
}
public static long readLongMM(InputStream is) throws IOException {
byte[] buf = new byte[8];
readFully(is, buf);
return (((buf[0]&0xffL)<<56)|((buf[1]&0xffL)<<48)|
((buf[2]&0xffL)<<40)|((buf[3]&0xffL)<<32)|((buf[4]&0xffL)<<24)|
((buf[5]&0xffL)<<16)|((buf[6]&0xffL)<<8)|(buf[7]&0xffL));
}
public static float readS15Fixed16MMNumber(byte[] buf, int start_idx) {
short s15 = (short)(((buf[start_idx++]&0xff)<<8)|(buf[start_idx++]&0xff));
int fixed16 = (((buf[start_idx++]&0xff)<<8)|(buf[start_idx]&0xff));
return s15 + fixed16/65536.0f;
}
public static float readS15Fixed16MMNumber(InputStream is) throws IOException {
byte[] buf = new byte[4];
IOUtils.readFully(is, buf);
short s15 = (short)((buf[1]&0xff)|((buf[0]&0xff)<<8));
int fixed16 = ((buf[3]&0xff)|((buf[2]&0xff)<<8));
return s15 + fixed16/65536.0f;
}
public static float readS15Fixed16Number(byte[] buf, int start_idx) {
short s15 = (short)((buf[start_idx++]&0xff)|((buf[start_idx++]&0xff)<<8));
int fixed16 = ((buf[start_idx++]&0xff)|((buf[start_idx]&0xff)<<8));
return s15 + fixed16/65536.0f;
}
public static float readS15Fixed16Number(InputStream is) throws IOException {
byte[] buf = new byte[4];
IOUtils.readFully(is, buf);
short s15 = (short)((buf[0]&0xff)|((buf[1]&0xff)<<8));
int fixed16 = ((buf[2]&0xff)|((buf[3]&0xff)<<8));
return s15 + fixed16/65536.0f;
}
public static short readShort(byte[] buf, int start_idx) {
return (short)((buf[start_idx++]&0xff)|((buf[start_idx]&0xff)<<8));
}
public static short readShort(InputStream is) throws IOException {
byte[] buf = new byte[2];
readFully(is, buf);
return (short)(((buf[1]&0xff)<<8)|(buf[0]&0xff));
}
public static short readShortMM(byte[] buf, int start_idx) {
return (short)(((buf[start_idx++]&0xff)<<8)|(buf[start_idx]&0xff));
}
public static short readShortMM(InputStream is) throws IOException {
byte[] buf = new byte[2];
readFully(is, buf);
return (short)(((buf[0]&0xff)<<8)|(buf[1]&0xff));
}
public static long readUnsignedInt(byte[] buf, int start_idx) {
return ((buf[start_idx++]&0xff)|((buf[start_idx++]&0xff)<<8)|
((buf[start_idx++]&0xff)<<16)|((buf[start_idx++]&0xff)<<24))& 0xffffffffL;
}
public static long readUnsignedInt(InputStream is) throws IOException {
byte[] buf = new byte[4];
readFully(is, buf);
return (((buf[3]&0xff)<<24)|((buf[2]&0xff)<<16)|
((buf[1]&0xff)<<8)|(buf[0]&0xff))& 0xffffffffL;
}
public static long readUnsignedIntMM(byte[] buf, int start_idx) {
return readIntMM(buf, start_idx) & 0xffffffffL;
}
public static long readUnsignedIntMM(InputStream is) throws IOException {
return readIntMM(is) & 0xffffffffL;
}
public static int readUnsignedShort(byte[] buf, int start_idx) {
return (buf[start_idx++]&0xff)|((buf[start_idx]&0xff)<<8);
}
public static int readUnsignedShort(InputStream is) throws IOException {
byte[] buf = new byte[2];
readFully(is, buf);
return ((buf[1]&0xff)<<8)|(buf[0]&0xff);
}
public static int readUnsignedShortMM(byte[] buf, int start_idx) {
return ((buf[start_idx++]&0xff)<<8)|(buf[start_idx]&0xff);
}
public static int readUnsignedShortMM(InputStream is) throws IOException {
byte[] buf = new byte[2];
readFully(is, buf);
return ((buf[0]&0xff)<<8)|(buf[1]&0xff);
}
public static long skip(InputStream is, long len) throws IOException {
return is.skip(len);
}
public static void skipFully(InputStream is, int n) throws IOException {
readFully(is, new byte[n]);
}
public static void write(OutputStream os, byte[] bytes) throws IOException {
os.write(bytes);
}
public static void write(OutputStream os, byte[] bytes, int off, int len) throws IOException {
os.write(bytes, off, len);
}
public static void write(OutputStream os, int abyte) throws IOException {
os.write(abyte);
}
// Write an int to the OutputStream with Intel format
public static void writeInt(OutputStream os, int value) throws IOException {
os.write(new byte[] {
(byte)value,
(byte)(value>>>8),
(byte)(value>>>16),
(byte)(value>>>24)});
}
// Write an int to the OutputStream with Motorola format
public static void writeIntMM(OutputStream os, int value) throws IOException {
os.write(new byte[] {
(byte)(value >>> 24),
(byte)(value >>> 16),
(byte)(value >>> 8),
(byte)value});
}
public static void writeLong(OutputStream os, long value) throws IOException {
os.write(new byte[] {
(byte)value, (byte)(value>>>8),
(byte)(value>>>16), (byte)(value>>>24),
(byte)(value>>>32), (byte)(value>>>40),
(byte)(value>>>48), (byte)(value>>>56)});
}
public static void writeLongMM(OutputStream os, long value) throws IOException {
os.write(new byte[] {
(byte)(value>>>56),
(byte)(value>>>48),
(byte)(value>>>40),
(byte)(value>>>32),
(byte)(value>>>24),
(byte)(value>>>16),
(byte)(value>>>8),
(byte)value});
}
public static void writeShort(OutputStream os, int value) throws IOException {
os.write(new byte[] {
(byte)value,
(byte)(value >>> 8)});
}
public static void writeShortMM(OutputStream os, int value) throws IOException {
os.write(new byte[] {
(byte)(value >>> 8),
(byte)value});
}
private IOUtils() {}
}