《Java输入输出流2.ppt》由会员分享,可在线阅读,更多相关《Java输入输出流2.ppt(16页珍藏版)》请在三一办公上搜索。
1、Java输入输出流2,伍淳华北京邮电大学计算机学院,Java,Java输入输出流,例:用不同的方案实现将一个Employee记录数组写入文件,并将其读回内存(JAVA Core P602)1)以文本格式保存相同类型(Employee)的数据;2)以二进制格式保存相同类型的数据;,Java,Java输入输出流,采用分隔格式存储Employee记录的一个数组;-每条记录使用单独的一行存储;-不同的成员变量间由分隔符分开;以”|”作为分隔符;Harry Hacker|355500|1989|10|1 Carl Cracker|75000|1987|12|15 Tony Tester|38000|19
2、90|3|15,Java,Java输入输出流,写入记录-采用PrintWriter类;-成员变量之间用”|”分隔,一个记录占一行;-Employee类中增加一个方法:WriteData;public void writeData(PrintWriter out)throws IOException GregorianCalendar calendar=new GregorianCalendar();calendar.setTime(hireDay);out.println(name+|+salary+|+calendar.get(Calendar.YEAR)+|+(calendar.get(C
3、alendar.MONTH)+1)+|+calendar.get(Calendar.DAY_OF_MONTH);,Java,Java输入输出流,读出记录-需要从一行中将各成员变量分离出来;-java.util.StringTokenizer 提供了很多实用的方法来分隔带分隔符的字符串;eg:StringTokenizer tokenizer=new StringTokenizer(line,”|”);StringTokenizer tokenizer=new StringTokenizer(line,”|,.”);如果不指定分隔符集合,默认的就是”tnrf”;,Java,Java输入输出流,S
4、tringTokenizer(String str,String delim)StringTokeizer(String str)boolean hasMoreTokens()String nextToken()int countTokens()while(tokenizer.hasMoreTokens()String token=tokenizer.nextToken();/process token,Java,Java输入输出流,读出记录-为Employee类增加一个readData方法 public void readData(BufferedReader in)throws IOExc
5、eption String s=in.readLine();StringTokenizer t=new StringTokenizer(s,|);name=t.nextToken();salary=Double.parseDouble(t.nextToken();int y=Integer.parseInt(t.nextToken();int m=Integer.parseInt(t.nextToken();int d=Integer.parseInt(t.nextToken();GregorianCalendar calendar=new GregorianCalendar(y,m-1,d)
6、;hireDay=calendar.getTime();,Java,Java输入输出流,写入一个Employee数组-主类中增加一个写数组的静态方法 static void writeData(Employee employees,PrintWriter out)throws IOException/write number of employees out.println(employees.length);for(Employee e:employees)e.writeData(out);,Java,Java输入输出流,读出一个Employee数组-主类中增加一个读数组的静态方法 stat
7、ic Employee readData(BufferedReader in)throws IOException/retrieve the array size int n=Integer.parseInt(in.readLine();Employee employees=new Employeen;for(int i=0;i n;i+)employeesi=new Employee();employeesi.readData(in);return employees;,Java,Java输入输出流,采用二进制的方式存储Employee数组;-当存储大量Employee对象时,采用文本方式保
8、存每个对象的长度不等,因此很难实现随机存取;-采用二进制存储方式让每条记录具有相同的长度;-可以通过RandomAccessFile实现随机存取;-简单数据类型通过DataOutput接口的相关方法可以实现定长写入文件;-String类型的数据长度不定,需提供方法将字符串以固定长度写入文件;-自定类DataIO实现定长字符串的输入与输出;,Java,Java输入输出流,实现字符串定长写入-方法以参数size指定字符串写入的长度,如果不够,以0补充;public static void writeFixedString(String s,int size,DataOutput out)throw
9、s IOException for(int i=0;i size;i+)char ch=0;if(i s.length()ch=s.charAt(i);out.writeChar(ch);,Java,Java输入输出流,实现定长字符串输入-方法从输入流中读取字符,直到读取了size个字符或者遇到一个0值的字符为止,并跳过输入域中其他的0值;public static String readFixedString(int size,DataInput in)throws IOException StringBuilder b=new StringBuilder(size);int i=0;boo
10、lean more=true;while(more,Java,Java输入输出流,写入定长的记录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.writeI
11、nt(calendar.get(Calendar.MONTH)+1);out.writeInt(calendar.get(Calendar.DAY_OF_MONTH);,Java,Java输入输出流,读出定长的记录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
12、calendar=new GregorianCalendar(y,m-1,d);hireDay=calendar.getTime();,Java,Java输入输出流,设定每个Employee记录的长度为100字节;-年、月、日三整型:12字节;-salary,double类型:8字节;-name:80字节;随机存取-把文件指针定位到第3条记录 long n=3;int RECORD_SIZE=100;in.seek(n-1)*RECORD_SIZE);-读取一条记录 Employee e=new Employee();e.readData(in);-修改记录并存回相同的位置 in.seek(n
13、-1)*RECORD_SIZE);e.writeData(out);,Java,Java输入输出流,设定每个Employee记录的长度为100字节;-年、月、日三整型:12字节;-salary,double类型:8字节;-name:80字节;随机存取-把文件指针定位到第3条记录 long n=3;int RECORD_SIZE=100;in.seek(n-1)*RECORD_SIZE);-读取一条记录 Employee e=new Employee();e.readData(in);-修改记录并存回相同的位置 in.seek(n-1)*RECORD_SIZE);e.writeData(out);,