135 lines
3.4 KiB
Java
135 lines
3.4 KiB
Java
package jxl.read.biff;
|
|
|
|
import common.Logger;
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.io.InterruptedIOException;
|
|
import jxl.WorkbookSettings;
|
|
import jxl.biff.BaseCompoundFile;
|
|
import jxl.biff.IntegerHelper;
|
|
import jxl.biff.Type;
|
|
|
|
public class File {
|
|
private static Logger logger = Logger.getLogger(File.class);
|
|
|
|
private byte[] data;
|
|
|
|
private int filePos;
|
|
|
|
private int oldPos;
|
|
|
|
private int initialFileSize;
|
|
|
|
private int arrayGrowSize;
|
|
|
|
private CompoundFile compoundFile;
|
|
|
|
private WorkbookSettings workbookSettings;
|
|
|
|
public File(InputStream is, WorkbookSettings ws) throws IOException, BiffException {
|
|
this.workbookSettings = ws;
|
|
this.initialFileSize = this.workbookSettings.getInitialFileSize();
|
|
this.arrayGrowSize = this.workbookSettings.getArrayGrowSize();
|
|
byte[] d = new byte[this.initialFileSize];
|
|
int bytesRead = is.read(d);
|
|
int pos = bytesRead;
|
|
if (Thread.currentThread().isInterrupted())
|
|
throw new InterruptedIOException();
|
|
while (bytesRead != -1) {
|
|
if (pos >= d.length) {
|
|
byte[] newArray = new byte[d.length + this.arrayGrowSize];
|
|
System.arraycopy(d, 0, newArray, 0, d.length);
|
|
d = newArray;
|
|
}
|
|
bytesRead = is.read(d, pos, d.length - pos);
|
|
pos += bytesRead;
|
|
if (Thread.currentThread().isInterrupted())
|
|
throw new InterruptedIOException();
|
|
}
|
|
bytesRead = pos + 1;
|
|
if (bytesRead == 0)
|
|
throw new BiffException(BiffException.excelFileNotFound);
|
|
CompoundFile cf = new CompoundFile(d, ws);
|
|
try {
|
|
this.data = cf.getStream("workbook");
|
|
} catch (BiffException e) {
|
|
this.data = cf.getStream("book");
|
|
}
|
|
if (!this.workbookSettings.getPropertySetsDisabled() && cf.getNumberOfPropertySets() > BaseCompoundFile.STANDARD_PROPERTY_SETS.length)
|
|
this.compoundFile = cf;
|
|
cf = null;
|
|
if (!this.workbookSettings.getGCDisabled())
|
|
System.gc();
|
|
}
|
|
|
|
public File(byte[] d) {
|
|
this.data = d;
|
|
}
|
|
|
|
Record next() {
|
|
Record r = new Record(this.data, this.filePos, this);
|
|
return r;
|
|
}
|
|
|
|
Record peek() {
|
|
int tempPos = this.filePos;
|
|
Record r = new Record(this.data, this.filePos, this);
|
|
this.filePos = tempPos;
|
|
return r;
|
|
}
|
|
|
|
public void skip(int bytes) {
|
|
this.filePos += bytes;
|
|
}
|
|
|
|
public byte[] read(int pos, int length) {
|
|
byte[] ret = new byte[length];
|
|
try {
|
|
System.arraycopy(this.data, pos, ret, 0, length);
|
|
} catch (ArrayIndexOutOfBoundsException e) {
|
|
logger.error("Array index out of bounds at position " + pos + " record length " + length);
|
|
throw e;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
public int getPos() {
|
|
return this.filePos;
|
|
}
|
|
|
|
public void setPos(int p) {
|
|
this.oldPos = this.filePos;
|
|
this.filePos = p;
|
|
}
|
|
|
|
public void restorePos() {
|
|
this.filePos = this.oldPos;
|
|
}
|
|
|
|
private void moveToFirstBof() {
|
|
boolean bofFound = false;
|
|
while (!bofFound) {
|
|
int code = IntegerHelper.getInt(this.data[this.filePos], this.data[this.filePos + 1]);
|
|
if (code == Type.BOF.value) {
|
|
bofFound = true;
|
|
continue;
|
|
}
|
|
skip(128);
|
|
}
|
|
}
|
|
|
|
public void close() {}
|
|
|
|
public void clear() {
|
|
this.data = null;
|
|
}
|
|
|
|
public boolean hasNext() {
|
|
return (this.filePos < this.data.length - 4);
|
|
}
|
|
|
|
CompoundFile getCompoundFile() {
|
|
return this.compoundFile;
|
|
}
|
|
}
|