scaledrafile.java

来自「纯Java的数据库」· Java 代码 · 共 525 行 · 第 1/2 页

JAVA
525
字号
        try {            long fileLength = file.length();            if (seekPosition >= fileLength) {                return -1;            }            if (bufferDirty || seekPosition < bufferOffset                    || seekPosition >= bufferOffset + buffer.length) {                readIntoBuffer();            } else {                cacheHit++;            }            ba.reset();            ba.skip(seekPosition - bufferOffset);            int val = ba.read();            seekPosition++;            return val;        } catch (IOException e) {            resetPointer();            appLog.logContext(e, null);            throw e;        }    }    public long readLong() throws IOException {        try {            if (bufferDirty || seekPosition < bufferOffset                    || seekPosition >= bufferOffset + buffer.length) {                readIntoBuffer();            } else {                cacheHit++;            }            ba.reset();            if (seekPosition - bufferOffset                    != ba.skip(seekPosition - bufferOffset)) {                throw new EOFException();            }            long val;            try {                val = ba.readLong();            } catch (EOFException e) {                file.seek(seekPosition);                val          = file.readLong();                realPosition = file.getFilePointer();            }            seekPosition += 8;            return val;        } catch (IOException e) {            resetPointer();            appLog.logContext(e, null);            throw e;        }    }    public int readInt() throws IOException {        try {            if (bufferDirty || seekPosition < bufferOffset                    || seekPosition >= bufferOffset + buffer.length) {                readIntoBuffer();            } else {                cacheHit++;            }            ba.reset();            if (seekPosition - bufferOffset                    != ba.skip(seekPosition - bufferOffset)) {                throw new EOFException();            }            int val;            try {                val = ba.readInt();            } catch (EOFException e) {                file.seek(seekPosition);                val          = file.readInt();                realPosition = file.getFilePointer();            }            seekPosition += 4;            return val;        } catch (IOException e) {            resetPointer();            appLog.logContext(e, null);            throw e;        }    }    public void read(byte[] b, int offset, int length) throws IOException {        try {            if (bufferDirty || seekPosition < bufferOffset                    || seekPosition >= bufferOffset + buffer.length) {                readIntoBuffer();            } else {                cacheHit++;            }            ba.reset();            if (seekPosition - bufferOffset                    != ba.skip(seekPosition - bufferOffset)) {                throw new EOFException();            }            int bytesRead = ba.read(b, offset, length);            seekPosition += bytesRead;            if (bytesRead < length) {                if (seekPosition != realPosition) {                    file.seek(seekPosition);                }                file.readFully(b, offset + bytesRead, length - bytesRead);                seekPosition += (length - bytesRead);                realPosition = seekPosition;            }        } catch (IOException e) {            resetPointer();            appLog.logContext(e, null);            throw e;        }    }    public void write(byte[] b, int off, int len) throws IOException {        try {            if (realPosition != seekPosition) {                file.seek(seekPosition);                realPosition = seekPosition;            }            if (seekPosition >= bufferOffset                    && seekPosition < bufferOffset + buffer.length) {                bufferDirty = true;            }            file.write(b, off, len);            seekPosition += len;            realPosition = seekPosition;        } catch (IOException e) {            resetPointer();            appLog.logContext(e, null);            throw e;        }    }    public void writeInt(int i) throws IOException {        try {            if (realPosition != seekPosition) {                file.seek(seekPosition);                realPosition = seekPosition;            }            if (seekPosition >= bufferOffset                    && seekPosition < bufferOffset + buffer.length) {                bufferDirty = true;            }            file.writeInt(i);            seekPosition += 4;            realPosition = seekPosition;        } catch (IOException e) {            resetPointer();            appLog.logContext(e, null);            throw e;        }    }    public void writeLong(long i) throws IOException {        try {            if (realPosition != seekPosition) {                file.seek(seekPosition);                realPosition = seekPosition;            }            if (seekPosition >= bufferOffset                    && seekPosition < bufferOffset + buffer.length) {                bufferDirty = true;            }            file.writeLong(i);            seekPosition += 8;            realPosition = seekPosition;        } catch (IOException e) {            resetPointer();            appLog.logContext(e, null);            throw e;        }    }    public void close() throws IOException {        Trace.printSystemOut("cache hit " + cacheHit);        file.close();    }    public boolean isReadOnly() {        return readOnly;    }    public boolean wasNio() {        return false;    }    public boolean canAccess(int length) {        return true;    }    public boolean canSeek(long position) {        return true;    }    public Database getDatabase() {        return null;    }    private void resetPointer() {        try {            bufferDirty = true;            file.seek(seekPosition);            realPosition = seekPosition;        } catch (Throwable e) {}    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?