📄 btreenodefileuos.java
字号:
/* BtreeNodeFileUos.java
* ---------------------------------------------
* Copyright (c) 2001 University of Saskatchewan
* All Rights Reserved
* --------------------------------------------- */
package dslib.file;
import java.io.IOException;
/** This class implements a file that is specifically designed to store
Btree interior nodes. It saves file addresses for discarded nodes and
allows these addresses to be returned for reuse by other nodes. */
public class BtreeNodeFileUos extends ObjectFileUos
{
/** The maximum number of bytes that a node can take up when written to disk. */
protected int nodeSize;
/** The name of the file associated with this object */
protected String name;
/** Return the maximum number of bytes that a node
can take up when written to disk.
Analysis : Time = O(1) */
public int nodeSize()
{
return nodeSize;
}
/** The last address of a node returned for reuse; -1 if no address has been returned yet. */
protected long lastReturnedAddress;
/** The last address of a node returned for reuse. -1 if no address has been returned yet. <br>
Analysis : Time = O(1) */
public long lastReturnedAddress()
{
return lastReturnedAddress;
}
/** The next address that will be given out if no more recovered addresses
are left to be given out. */
protected long nextAddress;
/** Create a node file from the data contained within a BtreeFileHeaderUos object. <br>
Analysis : Time = O(1) + 1 file write
@param h The file header where data about a previous node file is stored */
public BtreeNodeFileUos(BtreeFileHeaderUos h)
{
super(h.nodeFileName(), "rw");
nextAddress = h.nextNodeAddress;
name = h.nodeFileName();
nodeSize = h.nodeSize;
lastReturnedAddress = h.firstFreeNodeAddress;
}
/** Create a new node file from a given file name. <br>
Analysis : Time = O(1) + 1 file write
@param n The name of the file where nodes will be written
@param ns The maximum size (in bytes) that nodes will be when written to disk */
public BtreeNodeFileUos(String n, int ns)
{
super(n, "rw");
/* The call to super will move the file pointer to the byte offset
that is equal to the size of a file header for the ObjectStreams */
nextAddress = position();
name = n;
nodeSize = ns;
lastReturnedAddress = -1;
}
/** Add nodeAddress to the list of addresses available for future nodes. <br>
Analysis : Time = O(1) + 1 file write
@param nodeAddress The address to be returned for reuse */
public void recoverNodeAddress(long nodeAddress)
{
writeObjectAt(new Long(lastReturnedAddress), nodeAddress);
lastReturnedAddress = nodeAddress;
}
/** Obtain the next avalible file address. <br>
Analysis : Time = O(1) + 1 file read. */
public long getNextFileAddress()
{
long result;
if (lastReturnedAddress == -1)
{
result = nextAddress;
nextAddress += nodeSize;
}
else
{
result = lastReturnedAddress;
lastReturnedAddress = ((Long) readObjectFrom(lastReturnedAddress)).longValue();
}
return result;
}
/** Write newNode to disk. <br>
Analysis : Time = O(1) + 1 file write.
@param newNode The node to be written to disk */
public void writeNode(BtreeInteriorUos newNode)
{
writeObjectAt(newNode, newNode.fileAddress());
}
/** Read a node from a specific location on disk. <br>
Analysis: Time = O(1) file read
@param address The address on disk where a node will be read */
public BtreeInteriorUos readNode(long address)
{
return (BtreeInteriorUos) readObjectFrom(address);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -