java核心技术II:随机访问文件

来源:互联网 发布:ecshop2.7.3源码下载 编辑:程序博客网 时间:2024/06/08 13:32

程序清单1-2 RandomFileTest.java
将三条记录写到一个数据文件中,然后以逆序将他们从文件中读回。为了高效的执行,这里需要使用随机访问,因为我们需要首先读入第三条记录。

import java.io.DataInput;import java.io.DataOutput;import java.io.DataOutputStream;import java.io.FileOutputStream;import java.io.FileReader;import java.io.IOException;import java.io.PrintWriter;import java.io.RandomAccessFile;import java.nio.ByteBuffer;import java.nio.CharBuffer;import java.nio.charset.Charset;import java.util.Calendar;import java.util.Collection;import java.util.Date;import java.util.GregorianCalendar;import java.util.Map;import java.util.Scanner;import java.util.Set;import org.omg.CosNaming.NamingContextExtPackage.StringNameHelper;/** *  * @author Administrator *新浪微博:ouc大飞 */public class RandomFileTest {    public static void main(String[] args) {        /*Charset charset=Charset.forName("ISO8859-1");        //System.out.println(charset);        Set<String> aliases=charset.aliases();        for(String string:aliases){            System.out.println(string);        }*/        /*         * 获得所有可用的字符集         */        /*Map<String, Charset> map=Charset.availableCharsets();        Set<String> set=map.keySet();        for(String string:set){            System.out.println(string);        }*/        /*         * 输出字符集的key和value         */        /*Map<String, Charset> map=Charset.availableCharsets();        Collection<Charset> set=map.values();        Set<String> set1=map.keySet();        for(String string1:set1){            System.out.println(string1);        }        for(Charset string:set){            System.out.println(string);        }*/        /*         * 对字符集编码解码         */        /*Charset charset=Charset.forName("ISO-8859-1");        String string="hello";        ByteBuffer buffer=charset.encode(string);        byte[] bs=buffer.array();        System.out.println(bs);        CharBuffer buffer2=charset.decode(buffer);        String string2=buffer2.toString();        System.out.println(string2);*/        DEmployee[] staff=new  DEmployee[3];        staff[0]=new  DEmployee("Carl Cracker", 75000, 1987, 12, 15);        staff[1]=new  DEmployee("Harry Hacker", 50000, 1989, 10, 1);        staff[2]=new  DEmployee("Tony Tester", 4000, 1990, 3, 15);        try {            DataOutputStream out =new  DataOutputStream(new FileOutputStream("D:\\demployee.txt"));            for(DEmployee e:staff){                e.writeData(out);            }            out.close();            RandomAccessFile in=new  RandomAccessFile("D:\\demployee.txt", "r");            int n=(int)(in.length()/DEmployee.RECORD_SIZE);            DEmployee[] newStaff=new DEmployee[n];            System.out.println(n);            for(int i=n-1;i>=0;i--){                newStaff[i]=new  DEmployee();                in.seek(i*DEmployee.RECORD_SIZE);                newStaff[i].readData(in);            }            in.close();            for(DEmployee e:newStaff)                System.out.println(e);        } catch (Exception e) {            // TODO: handle exception            e.printStackTrace();        }    }}class DEmployee {    public DEmployee(){    }    public DEmployee(String n,double s,int year,int month,int day){        name=n;        salary=s;        GregorianCalendar calendar=new  GregorianCalendar(year,month-1,day);        hireDay=calendar.getTime();    }    public String getName() {        return name;    }    public double getSalary() {        return salary;    }    public Date getHireDay() {        return hireDay;    }    public void raiseSalary(double byPercent){        double raise=salary*byPercent/100;        salary+=raise;    }    public String toString() {        return getClass().getName()+"[name="+name+",salary="+salary+",hireDay="+hireDay+"]";    }    public void writeData(DataOutput out) throws IOException {        DataIO .writeFixedString(name,NAME_SIZE,out);        out.writeDouble(salary);        GregorianCalendar calendar=new  GregorianCalendar();        calendar.setTime(hireDay);        out.writeInt(calendar.get(Calendar.YEAR));        out.writeInt(calendar.get(Calendar.MONTH)+1);        out.writeInt(calendar.get(Calendar.DAY_OF_MONTH));    }    public void  readData(DataInput in) throws IOException {        name=DataIO.readFixedString(NAME_SIZE, in);        salary=in.readDouble();        int y=in.readInt();        int m=in.readInt();        int d=in.readInt();        GregorianCalendar calendar=new  GregorianCalendar(y,m-1,d);        hireDay=calendar.getTime();    }    public static final int NAME_SIZE=40;    public static final int RECORD_SIZE=2*NAME_SIZE+8+4+4+4;    private String name;    private double salary;    private Date hireDay;}class DataIO{    public static String readFixedString(int size,DataInput in) throws IOException{        StringBuilder builder=new  StringBuilder(size);        int i=0;        boolean more=true;        while (more&&i<size) {            char ch=in.readChar();            i++;            if(ch==0)                more=false;            else {                builder.append(ch);            }        }        in.skipBytes(2*(size-i));        return builder.toString();    }    public static void writeFixedString(String s,int size,DataOutput out) throws IOException{        for(int i=0;i<size;i++){            char ch=0;            if(i<s.length()){                ch=s.charAt(i);            }            out.writeChar(ch);        }    }}
0 0