//DB (RandomAccessFile)
import java.io.*;
import java.awt.*;
import java.awt.event.*;
public class DB_RAF extends Frame
implements WindowListener, ActionListener {
TextArea tData;
TextField tDay, tMonth, tYear;
Checkbox chState;
Button bWrite, bPrev, bNext;
Panel pN, pS;
int recNbr; //кол-во записей в базе и
int pointer; //номер текущей записи
RandomAccessFile f; //файл базы данных
char buf[]; //вспомогательный массив char
public DB_RAF(String s) { //Конструктор
super(s); //Создание элементов интерфейса
tData = new TextArea(); //и регистрация Listener'ов
tDay = new TextField(2);
tMonth = new TextField(2);
tYear = new TextField(4);
chState = new Checkbox();
bWrite = new Button("Add record");
bPrev = new Button("<");
bNext = new Button(">");
pN = new Panel(); pN.setBackground(Color.lightGray);
pN.add(tDay); pN.add(tMonth); pN.add(tYear); pN.add(chState);
add(pN, "North");
pS = new Panel(); pS.setBackground(Color.lightGray);
pS.add(bWrite); pS.add(bPrev); pS.add(bNext);
add(pS, "South");
add(tData, "Center");
addWindowListener(this);
bWrite.addActionListener(this);
bNext.addActionListener(this);
bPrev.addActionListener(this);
setBounds(50,50,300,200);
setVisible(true);
}
public static void main(String arg[]) {
DB_RAF db = new DB_RAF("DB (RandomAccessFile)");
db.buf = new char[100]; // создаем временный буфер
try { //открытие файла
db.f = new RandomAccessFile("db_raf.dat", "rw");
db.recNbr = db.f.readInt(); //чтение кол-ва записей с нулевой позиции
} catch(IOException ioe) {}
db.pointer = 0;
db.showRec(db.pointer); //показываем первую запись
}
public void actionPerformed(ActionEvent ae) {
if (ae.getSource()==bWrite) { //Добавление записи в файл
try {
f.seek(4+205*recNbr); //переход конец файла
//запись содержимого поля дня как байта:
f.writeByte(Byte.parseByte(tDay.getText().trim()));
//запись содержимого поля месяца как байта:
f.writeByte(Byte.parseByte(tMonth.getText().trim()));
//запись содержимого поля года как short:
f.writeShort(Short.parseShort(tYear.getText().trim()));
//запись состояния как boolean:
f.writeBoolean(chState.getState());
StringBuffer s = new StringBuffer(tData.getText().trim());
for (int i=0; i<100; i++) //заполнение врем. буфера
buf[i] = (i<s.length()) ? s.charAt(i) : 32;
//преобразование буфера в строку и запись ее в файл:
f.writeChars(new String(buf));
recNbr++; //увеличиваем счетчик записей на единицу
f.seek(0); f.writeInt(recNbr); //записываем в начало файла
} catch(IOException ioe) {}
}
//Показ след записи:
if (ae.getSource()==bNext && pointer<recNbr-1) {
pointer++; showRec(pointer);
}
//Показ предыдущей записи:
if (ae.getSource()==bPrev && pointer>0) {
pointer--; showRec(pointer);
}
}
public void showRec(int n) { //показ записи на экране
try {
f.seek(4+205*n); //переход на начало нужной записи
//читаем день, преобразуем в строку и заносим в поле:
tDay.setText(String.valueOf(f.readByte()));
//читаем месяц, преобразуем в строку и заносим в поле:
tMonth.setText(String.valueOf(f.readByte()));
//читаем год, преобразуем в строку и заносим в поле:
tYear.setText(String.valueOf(f.readShort()));
//читаем состояние, устанавливаем checkbox:
chState.setState(f.readBoolean());
//читаем в буфер 100 символов (200 байт):
for (int i=0; i<100; i++) buf[i] = f.readChar();
//преобразуем буфер в строку и заносим в текстовое поле:
tData.setText((new String(buf)).trim());
}
catch(IOException ioe) {}
}
//Реализация WindowListener:
public void windowClosing(WindowEvent we) {
//закрытие файла перед выходом из программы:
try {f.close();} catch(IOException ioe){}
System.exit(0);
}
public void windowClosed(WindowEvent wEvt){}
public void windowOpened(WindowEvent wEvt){}
public void windowIconified(WindowEvent wEvt){}
public void windowDeiconified(WindowEvent wEvt){}
public void windowActivated(WindowEvent wEvt){}
public void windowDeactivated(WindowEvent wEvt){}
}