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 + -
显示快捷键?