?? filerandomrw.java
字號:
//FileRandomRW.java
import java.io.*;
import java.util.*;
public class FileRandomRW
{
//需要輸入的person數目。
public static int NUMBER = 3;
public static void main(String[] args)
{
Person[] people = new Person[NUMBER];
people[0] = new Person("張三", 25, 3000);
people[1] = new Person("李四", 35, 10000, "Y");
people[2] = new Person("王大五", 30, 4000, "F");
try
{
DataOutputStream out = new DataOutputStream(new
FileOutputStream("peoplerandom.dat"));
//將人員數據保存至“peoplerandom.dat”二進制文件中。
writeData(people, out);
//關閉流。
out.close();
//從二進制文件“peoplerandom.dat”中逆序讀取數據。
RandomAccessFile inOut = new RandomAccessFile("peoplerandom.dat", "rw");
Person[] inPeople = readDataReverse(inOut);
//輸出讀入的數據。
System.out.println("原始數據:");
for (int i = 0; i < inPeople.length; i++)
System.out.println(inPeople[i]);
//修改文件的第三條記錄。
inPeople[2].setSalary(4500);
//將修改結果寫入文件。
inPeople[2].writeData(inOut, 3);
//關閉流。
inOut.close();
//從文件中讀入的第三條記錄,并輸出,以驗證修改結果。
RandomAccessFile in = new RandomAccessFile("peoplerandom.dat", "r");
Person in3People = new Person();
//隨機讀第三條記錄。
in3People.readData(in, 3);
//關閉流。
in.close();
System.out.println("修改后的記錄");
System.out.println(in3People);
}
catch(IOException exception)
{
System.err.println("IOException");
}
}
//將數據寫入輸出流。
static void writeData(Person[] p, DataOutputStream out)
throws IOException
{
for (int i = 0; i < p.length; i++)
p[i].writeData(out);
}
//將數據從輸入流中逆序讀出。
static Person[] readDataReverse(RandomAccessFile in)
throws IOException
{
//獲得記錄數目。
int record_num = (int)(in.length()/Person.RECORD_LENGTH);
Person[] p = new Person[record_num];
//逆序讀取。
for (int i = record_num-1 ; i >= 0 ; i--)
{
p[i] = new Person();
//文件定位。
in.seek(i * Person.RECORD_LENGTH);
p[i].readData(in, i+1);
}
return p;
}
}
class Person
{
private String name;
private int age; //4個字節
private double salary; //8個字節
private String married;
public static final int NAME_LENGTH = 20; //姓名長度
public static final int MARRIED_LENGTH = 2;//婚否長度
public static final int RECORD_LENGTH = NAME_LENGTH * 2 + 4 + 8 + MARRIED_LENGTH * 2;
public Person()
{
}
public Person(String n, int a, double s)
{
name = n;
age = a;
salary = s;
married = "F";
}
public Person(String n, int a, double s, String m)
{
name = n;
age = a;
salary = s;
married = m;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public double getSalary()
{
return salary;
}
public String getMarried()
{
return married;
}
public String setName(String n)
{
name = n;
return name;
}
public int setAge(int a)
{
age = a;
return age;
}
public double setSalary(double s)
{
salary = s;
return salary;
}
public String setMarried(String m)
{
married = m;
return married;
}
//設置輸出格式。
public String toString()
{
return getClass().getName() + "[name=" + name
+ ",age=" + age
+ ",salary=" + salary
+ ",married=" + married
+ "]";
}
//寫入一條固定長度的記錄,即一個人的數據到輸出流。
public void writeData(DataOutput out) throws IOException
{
FixStringIO.writeFixString(name, NAME_LENGTH, out);
out.writeInt(age);
out.writeDouble(salary);
FixStringIO.writeFixString(married, MARRIED_LENGTH, out);
}
//寫入一條固定長度的記錄到隨機讀取文件中。
private void writeData(RandomAccessFile out) throws IOException
{
FixStringIO.writeFixString(name, NAME_LENGTH, out);
out.writeInt(age);
out.writeDouble(salary);
FixStringIO.writeFixString(married, MARRIED_LENGTH, out);
}
//隨機寫入一條固定長度的記錄到輸出流的指定位置。
public void writeData(RandomAccessFile out, int n) throws IOException
{
out.seek((n - 1) * RECORD_LENGTH);
writeData(out);
}
//從輸入流隨機讀入一條記錄,即一個人的數據。
private void readData(RandomAccessFile in) throws IOException
{
name = FixStringIO.readFixString(NAME_LENGTH, in);
age = in.readInt();
salary = in.readDouble();
married = FixStringIO.readFixString(MARRIED_LENGTH, in);
}
//從輸入流隨機讀入指定位置的記錄。
public void readData(RandomAccessFile in, int n) throws IOException
{
in.seek((n - 1) * RECORD_LENGTH);
readData(in);
}
}
//對固定長度字符串從文件讀出、寫入文件
class FixStringIO
{
//讀取固定長度的Unicode字符串。
public static String readFixString(int size, DataInput in)
throws IOException
{
StringBuffer b = new StringBuffer(size);
int i = 0;
boolean more = true;
while (more && i < size)
{
char ch = in.readChar();
i++;
if (ch == 0) more = false;
else b.append(ch);
}
//跳過剩余的字節。
in.skipBytes(2 * (size - i));
return b.toString();
}
//寫入固定長度的Unicode字符串。
public static void writeFixString(String s, int size, DataOutput out)
throws IOException
{
int i;
for (i = 0; i < size; i++)
{
char ch = 0;
if (i < s.length()) ch = s.charAt(i);
out.writeChar(ch);
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -