Files
HRMS/hrmsEjb/jxl/read/biff/File.java
2025-07-28 13:56:49 +05:30

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;
}
}