View
50
Download
0
Category
Preview:
DESCRIPTION
Random Access Files. CSC 171 FALL 2004 LECTURE 23. Sequential File Access. Sequential access Data in files are accessed one item after another The 4 th item cannot be read without reading the first 3 items Imagine updating the 1000000 th item and then updating the 999999 th. - PowerPoint PPT Presentation
Citation preview
Random Access FilesRandom Access Files
CSC 171 FALL 2004
LECTURE 23
Sequential File AccessSequential File Access
Sequential access– Data in files are accessed one item after another– The 4th item cannot be read without reading the
first 3 items– Imagine updating the 1000000th item and then
updating the 999999th
Random/Direct AccessRandom/Direct Access
The middle of the file can be – Retrieved– Modified– Rewritten
without reading/writing other dataGood for data base applications
In a ___________________ file access, a file is processed a byte at a time, in order.
In a ____sequential____ file access, a file is processed a byte at a time, in order.
______________ access allow access at arbitrary locations in the file, without first reading the bytes preceding the access location.
__Random______ access allow access at arbitrary locations in the file, without first reading the bytes preceding the access location.
A file _____________ is a position in a random-access file.
A file ____pointer___________ is a position in a random-access file.
Because files can be very large a file pointer is of type ____________.
Because files can be very large a file pointer is of type ___long___.
File StructureFile Structure
The key to random access is file structureMost commonly
– Fixed length records consisting of Fixed length items
Example: Inventory control (16 byte record)– Product ID code (int – 4 bytes)– Quantity in stock (int – 4 bytes)– Price (double – 8 bytes)
RandomAccessFile ClassRandomAccessFile Class
RandomAccessFile raf = new RandomAccessFile(“products.dat”,”rw”);
– File name– Mode
“r” for read only “rw” for read & write
Pointer PositionPointer Position
Each random access stream establishes an internal pointer position
The pointer keeps track of where the next byte is to be accessed
The seek(long i) method permits the programmer to move to any byte position– 1st byte @ position 0
Example: Reverse a fileExample: Reverse a file
Consider the problem of reversing a file with sequential access
RandomAccessFile raf = new RandomAccessFile(fileName,"rw");
last = raf.length();
position = last - SIZEOFCHAR;while (position >= 0) { raf.seek(position); ch = (char)raf.readByte(); System.out.print(ch+"|"); position = position - SIZEOFCHAR;}raf.close();
}}
test.dat
This is a test.
OUTPUT
cd d:/courses/CSC171/CSC171FALL2001/code/
d:/devenv/jdk1.3/bin/javaw DisplayReversed
.|t|s|e|t| |a| |s|i| |s|i|h|T|
Process DisplayReversed finished
Example: InventoryExample: Inventory
Inventory control (16 byte record)– Product ID code (int – 4 bytes)– Quantity in stock (int – 4 bytes)– Price (double – 8 bytes)
// set up the keyboard for string input
InputStreamReader isr =
new InputStreamReader(System.in);
BufferedReader br =
new BufferedReader(isr);
for(int i = 1; i <= 5; i++)
{
System.out.print("Enter the identification number: ");
acctstring = br.readLine();
acct = Integer.parseInt(acctstring);
raf.writeInt(acct);
System.out.print("Enter the quantity in stock: ");
amtstring = br.readLine();
amt = Integer.parseInt(amtstring);
raf.writeInt(amt);
System.out.print("Enter the price: ");
pricestring = br.readLine();
price = Double.parseDouble(pricestring);
raf.writeDouble(price);
}
Read & Print the FileRead & Print the FileSystem.out.println(" Quantity");
System.out.println("ID. No. In Stock Price");
System.out.println("------- -------- ------");
// read and print the data
for(int i = 1; i <= 5; i++){
acct = raf.readInt();
amt = raf.readInt();
price = raf.readDouble();
System.out.println(" " + acct + " "
+ amt + " $" + price);
}
OUTPUTOUTPUTcd d:/courses/CSC171/CSC171FALL2001/code/bronson/d:/devenv/jdk1.3/bin/javaw ReadRandom QuantityID. No. In Stock Price------- -------- ------ 1001 476 $28.35 1002 240 $32.56 1003 517 $51.27 1004 284 $23.75 1005 165 $32.25 Process ReadRandom finished
Modify The DatabaseModify The DatabaseSet up KeyboardOpen fileLoop as long as user wants to modify
– Querry for ID number– Look up & display quantity– Querry for modification– Write modified value
Close file
Loop & querry IDLoop & querry ID
while (!acctstring.equals("999")) {
recnum = Integer.parseInt(acctstring) - BASEREC;
position = (recnum - 1) * RECLEN;
Move to the recordMove to the recordraf.seek(position); acct = raf.readInt();
//save loc ready to read/write amntsetbytepos = raf.getFilePointer(); amt = raf.readInt();System.out.println("The current quantity in stock is: " + amt);
UPDATEUPDATE
System.out.print("Enter the new quantity: ");
amtstring = br.readLine();
amt = Integer.parseInt(amtstring);
raf.seek(setbytepos); //reset loc
raf.writeInt(amt);
Recommended