first commit
This commit is contained in:
134
hrmsEjb/jxl/read/biff/File.java
Normal file
134
hrmsEjb/jxl/read/biff/File.java
Normal file
@@ -0,0 +1,134 @@
|
||||
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;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user