Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions src/main/java/org/scijava/io/handle/AbstractDataHandle.java
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,13 @@ public abstract class AbstractDataHandle<L extends Location> extends
AbstractWrapperPlugin<L> implements DataHandle<L>
{

private byte[] conversionBuffer = new byte[8];

@Override
public byte[] conversionBuffer() {
return conversionBuffer;
}

// -- Fields --

private ByteOrder order = ByteOrder.BIG_ENDIAN;
Expand Down
158 changes: 36 additions & 122 deletions src/main/java/org/scijava/io/handle/DataHandle.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@

import org.scijava.io.location.Location;
import org.scijava.plugin.WrapperPlugin;
import org.scijava.util.Bytes;

/**
* A <em>data handle</em> is a plugin which provides both streaming and random
Expand Down Expand Up @@ -249,6 +250,11 @@ default void setLittleEndian(final boolean little) {
/** Sets the native encoding of the stream. */
void setEncoding(String encoding);

/**
* @return a 8 byte long buffer array used for type conversions
*/
byte[] conversionBuffer();

/** Reads a string of arbitrary length, terminated by a null char. */
default String readCString() throws IOException {
final String line = findString("\0");
Expand Down Expand Up @@ -514,18 +520,10 @@ default int readUnsignedByte() throws IOException {

@Override
default short readShort() throws IOException {
final int ch0;
final int ch1;
if (isBigEndian()) {
ch0 = read();
ch1 = read();
}
else {
ch1 = read();
ch0 = read();
}
if ((ch0 | ch1) < 0) throw new EOFException();
return (short) ((ch0 << 8) + (ch1 << 0));
final byte[] buf = conversionBuffer();
final int read = read(buf, 0, 2);
if (read < 2) throw new EOFException();
return Bytes.toShort(buf, isLittleEndian());
}

@Override
Expand All @@ -540,68 +538,20 @@ default char readChar() throws IOException {

@Override
default int readInt() throws IOException {
final int ch0;
final int ch1;
final int ch2;
final int ch3;
if (isBigEndian()) {
ch0 = read();
ch1 = read();
ch2 = read();
ch3 = read();
}
else {
ch3 = read();
ch2 = read();
ch1 = read();
ch0 = read();
}
if ((ch0 | ch1 | ch2 | ch3) < 0) throw new EOFException();
return ((ch0 << 24) + (ch1 << 16) + (ch2 << 8) + (ch3 << 0));
final byte[] buf = conversionBuffer();
final int read = read(buf, 0, 4);
if (read < 4) throw new EOFException();
return Bytes.toInt(buf, isLittleEndian());
}

@Override
default long readLong() throws IOException {
final int ch0;
final int ch1;
final int ch2;
final int ch3;
final int ch4;
final int ch5;
final int ch6;
final int ch7;
if (isBigEndian()) {
ch0 = read();
ch1 = read();
ch2 = read();
ch3 = read();
ch4 = read();
ch5 = read();
ch6 = read();
ch7 = read();
}
else {
ch7 = read();
ch6 = read();
ch5 = read();
ch4 = read();
ch3 = read();
ch2 = read();
ch1 = read();
ch0 = read();
}
if ((ch0 | ch1 | ch2 | ch3 | ch4 | ch5 | ch6 | ch7) < 0) {
final byte[] buf = conversionBuffer();
final int read = read(buf, 0, 8);
if (read < 8) {
throw new EOFException();
}
// TODO: Double check this inconsistent code.
return ((long) ch0 << 56) + //
((long) (ch1 & 255) << 48) + //
((long) (ch2 & 255) << 40) + //
((long) (ch3 & 255) << 32) + //
((long) (ch4 & 255) << 24) + //
((ch5 & 255) << 16) + //
((ch6 & 255) << 8) + //
((ch7 & 255) << 0);
return Bytes.toLong(buf, isLittleEndian());
}

@Override
Expand All @@ -618,7 +568,7 @@ default double readDouble() throws IOException {
default String readLine() throws IOException {
// NB: Adapted from java.io.RandomAccessFile.readLine().

final StringBuffer input = new StringBuffer();
final StringBuilder input = new StringBuilder();
int c = -1;
boolean eol = false;

Expand Down Expand Up @@ -669,76 +619,42 @@ default void writeByte(final int v) throws IOException {

@Override
default void writeShort(final int v) throws IOException {
if (isBigEndian()) {
write((v >>> 8) & 0xFF);
write((v >>> 0) & 0xFF);
}
else {
write((v >>> 0) & 0xFF);
write((v >>> 8) & 0xFF);
}
final byte[] buf = conversionBuffer();
Bytes.unpack(v, buf, 0, 2, isLittleEndian());
write(buf, 0, 2);
}

@Override
default void writeChar(final int v) throws IOException {
if (isBigEndian()) {
write((v >>> 8) & 0xFF);
write((v >>> 0) & 0xFF);
}
else {
write((v >>> 0) & 0xFF);
write((v >>> 8) & 0xFF);
}
writeShort(v);
}

@Override
default void writeInt(final int v) throws IOException {
if (isBigEndian()) {
write((v >>> 24) & 0xFF);
write((v >>> 16) & 0xFF);
write((v >>> 8) & 0xFF);
write((v >>> 0) & 0xFF);
}
else {
write((v >>> 0) & 0xFF);
write((v >>> 8) & 0xFF);
write((v >>> 16) & 0xFF);
write((v >>> 24) & 0xFF);
}
final byte[] buf = conversionBuffer();
Bytes.unpack(v, buf, 0, 4, isLittleEndian());
write(buf, 0, 4);
}

@Override
default void writeLong(final long v) throws IOException {
if (isBigEndian()) {
write((byte) (v >>> 56));
write((byte) (v >>> 48));
write((byte) (v >>> 40));
write((byte) (v >>> 32));
write((byte) (v >>> 24));
write((byte) (v >>> 16));
write((byte) (v >>> 8));
write((byte) (v >>> 0));
}
else {
write((byte) (v >>> 0));
write((byte) (v >>> 8));
write((byte) (v >>> 16));
write((byte) (v >>> 24));
write((byte) (v >>> 32));
write((byte) (v >>> 40));
write((byte) (v >>> 48));
write((byte) (v >>> 56));
}
final byte[] buf = conversionBuffer();
Bytes.unpack(v, buf, 0, 8, isLittleEndian());
write(buf, 0, 8);
}

@Override
default void writeFloat(final float v) throws IOException {
writeInt(Float.floatToIntBits(v));
final byte[] buf = conversionBuffer();
Bytes.unpack(Float.floatToIntBits(v), buf, 0, 4, isLittleEndian());
write(buf, 0, 4);
}

@Override
default void writeDouble(final double v) throws IOException {
writeLong(Double.doubleToLongBits(v));
final byte[] buf = conversionBuffer();
Bytes.unpack(Double.doubleToLongBits(v), buf, 0, 8, isLittleEndian());
write(buf, 0, 8);
}

@Override
Expand All @@ -750,9 +666,7 @@ default void writeBytes(final String s) throws IOException {
default void writeChars(final String s) throws IOException {
final int len = s.length();
for (int i = 0; i < len; i++) {
final int v = s.charAt(i);
write((v >>> 8) & 0xFF);
write((v >>> 0) & 0xFF);
writeChar(s.charAt(i));
}
}

Expand Down
65 changes: 0 additions & 65 deletions src/main/java/org/scijava/io/handle/FileHandle.java
Original file line number Diff line number Diff line change
Expand Up @@ -151,21 +151,6 @@ public byte readByte() throws IOException {
return reader().readByte();
}

@Override
public char readChar() throws IOException {
return reader().readChar();
}

@Override
public double readDouble() throws IOException {
return reader().readDouble();
}

@Override
public float readFloat() throws IOException {
return reader().readFloat();
}

@Override
public void readFully(final byte[] b) throws IOException {
reader().readFully(b);
Expand All @@ -178,36 +163,16 @@ public void readFully(final byte[] b, final int off, final int len)
reader().readFully(b, off, len);
}

@Override
public int readInt() throws IOException {
return reader().readInt();
}

@Override
public String readLine() throws IOException {
return reader().readLine();
}

@Override
public long readLong() throws IOException {
return reader().readLong();
}

@Override
public short readShort() throws IOException {
return reader().readShort();
}

@Override
public int readUnsignedByte() throws IOException {
return reader().readUnsignedByte();
}

@Override
public int readUnsignedShort() throws IOException {
return reader().readUnsignedShort();
}

@Override
public String readUTF() throws IOException {
return reader().readUTF();
Expand Down Expand Up @@ -252,41 +217,11 @@ public void writeBytes(final String s) throws IOException {
writer().writeBytes(s);
}

@Override
public void writeChar(final int v) throws IOException {
writer().writeChar(v);
}

@Override
public void writeChars(final String s) throws IOException {
writer().writeChars(s);
}

@Override
public void writeDouble(final double v) throws IOException {
writer().writeDouble(v);
}

@Override
public void writeFloat(final float v) throws IOException {
writer().writeFloat(v);
}

@Override
public void writeInt(final int v) throws IOException {
writer().writeInt(v);
}

@Override
public void writeLong(final long v) throws IOException {
writer().writeLong(v);
}

@Override
public void writeShort(final int v) throws IOException {
writer().writeShort(v);
}

@Override
public void writeUTF(final String str) throws IOException {
writer().writeUTF(str);
Expand Down
Loading