黑马程序员技术交流社区

标题: 为什么IO输出就王五是0? [打印本页]

作者: 韩爽    时间: 2012-7-30 22:46
标题: 为什么IO输出就王五是0?
本帖最后由 韩爽 于 2012-7-31 00:54 编辑
  1. package io_duxie;
  2. import java.io.*;

  3. import java.io.RandomAccessFile;

  4. import javax.swing.Spring;

  5. public class RandomFileTest {

  6. /**
  7. * 利用IO流 读写文件内容
  8. * @param args
  9. * @throws IOException
  10. */
  11. public static void main(String[] args) throws IOException {
  12. // TODO Auto-generated method stub
  13. //写入数据
  14. Employee e1=new Employee("张三",23);
  15. Employee d2=new Employee("李四",24);
  16. Employee f3=new Employee("王五",25);
  17. RandomAccessFile ra = new RandomAccessFile("1.txt", "rw");
  18. ra.writeChars(e1.name);//writeChars 将字符串写入
  19. //写入姓名,转换成字节getBytes遇到英文转换成字节为1,遇到中文转换字节2
  20. ra.writeInt(e1.age);//weite为一个字节,WeiteInt是四个字节

  21. ra.writeChars(d2.name);//writeChars 将字符串写入
  22. ra.writeInt(d2.age);//weite为一个字节,WeiteInt是四个字节

  23. ra.writeChars(f3.name);//writeChars 将字符串写入
  24. ra.writeInt(f3.age);//weite为一个字节,WeiteInt是四个字节
  25. ra.close();//关闭
  26. //读取数据

  27. String strName="";
  28. RandomAccessFile du = new RandomAccessFile("1.txt", "r");



  29. for(int i=0;i<Employee.Len;i++){
  30. strName+=du.readChar();
  31. }
  32. System.out.println(strName.trim()+":"+du.readInt());
  33. strName="";



  34. du.seek(0);//绝对定位
  35. du.skipBytes(Employee.Len*2+4);
  36. for(int i=0;i<Employee.Len;i++){
  37. strName+=du.readChar();
  38. }
  39. System.out.println(strName.trim()+":"+du.readInt());
  40. strName="";



  41. du.skipBytes(Employee.Len*2+4);
  42. for(int i=0;i<Employee.Len;i++){
  43. strName+=du.readChar();
  44. }
  45. System.out.println(strName.trim()+":"+du.readInt());//.trim去掉字符串中不可显示的字符
  46. strName="";


  47. du.close();//关闭
  48. }
  49. }
复制代码
  1. package io_duxie;

  2. public class Employee {

  3. public String name;
  4. public int age;
  5. public static final int Len=10;
  6. public Employee (String name,int age)
  7. {
  8. if(name.length()>Len){

  9. name.substring(0,Len);//当员工姓名超过8个字符自动取8个字符,substring方法
  10. }
  11. else
  12. {
  13. while(name.length()<Len)
  14. {
  15. name+="\u0000";
  16. }
  17. }
  18. this.name=name;
  19. this.age =age;
  20. }
  21. }

复制代码

36340-772335b80f4e1d501861f855f8802881.jpg (23.9 KB, 下载次数: 23)

36340-772335b80f4e1d501861f855f8802881.jpg

作者: 韩爽    时间: 2012-7-31 00:52
  1. package io_duxie;
  2. import java.io.*;

  3. import java.io.RandomAccessFile;

  4. import javax.swing.Spring;

  5. public class RandomFileTest {

  6. /**
  7. * 利用IO流 读写文件内容
  8. * @param args
  9. * @throws IOException
  10. */
  11. public static void main(String[] args) throws IOException {
  12. // TODO Auto-generated method stub
  13. //写入数据
  14. Employee e1=new Employee("张三",23);
  15. Employee d2=new Employee("李四",24);
  16. Employee f3=new Employee("王五",25);
  17. RandomAccessFile ra = new RandomAccessFile("1.txt", "rw");
  18. ra.writeChars(e1.name);//writeChars 将字符串写入
  19. //写入姓名,转换成字节getBytes遇到英文转换成字节为1,遇到中文转换字节2
  20. ra.writeInt(e1.age);//weite为一个字节,WeiteInt是四个字节

  21. ra.writeChars(d2.name);//writeChars 将字符串写入
  22. ra.writeInt(d2.age);//weite为一个字节,WeiteInt是四个字节

  23. ra.writeChars(f3.name);//writeChars 将字符串写入
  24. ra.writeInt(f3.age);//weite为一个字节,WeiteInt是四个字节
  25. ra.close();//关闭
  26. //读取数据

  27. String strName="";
  28. RandomAccessFile du = new RandomAccessFile("1.txt", "r");



  29. for(int i=0;i<Employee.Len;i++){
  30. strName+=du.readChar();
  31. }
  32. System.out.println(strName.trim()+":"+du.readInt());
  33. strName="";



  34. du.seek(0);//绝对定位
  35. du.skipBytes(Employee.Len*2+4);
  36. for(int i=0;i<Employee.Len;i++){
  37. strName+=du.readChar();
  38. }
  39. System.out.println(strName.trim()+":"+du.readInt());
  40. strName="";



  41. <FONT color=red>du.skipBytes(Employee.Len*2+4); 去掉</FONT>
  42. for(int i=0;i<Employee.Len;i++){
  43. strName+=du.readChar();
  44. }
  45. System.out.println(strName.trim()+":"+du.readInt());//.trim去掉字符串中不可显示的字符
  46. strName="";


  47. du.close();//关闭
  48. }
  49. }
复制代码
有位好心的 黑马-小新,虽然没回帖,但是很感谢他,希望以后出现跟我一样问题的人,都注意下、
作者: 王志明    时间: 2012-7-31 01:52
本帖最后由 王志明 于 2012-7-31 01:54 编辑

当局部变量和成员变量同名时,以this.成员变量区分
读取文件时可以使用嵌套循环,省点事
  1. import java.io.IOException;
  2. import java.io.RandomAccessFile;

  3. public class Test2 {

  4.         public static void main(String[] args) throws IOException {
  5.                 // 写入数据
  6.                 Employee e1 = new Employee("张三", 23);
  7.                 Employee d2 = new Employee("李四", 24);
  8.                 Employee f3 = new Employee("王五", 25);

  9.                 RandomAccessFile ra = new RandomAccessFile("1.txt", "rw");
  10.                 ra.writeChars(e1.name);// writeChars
  11.                                                                 // 将字符串写入,写入姓名,转换成字节getBytes遇到英文转换成字节为1,遇到中文转换字节2
  12.                 ra.writeInt(e1.age);// weite为一个字节,WeiteInt是四个字节

  13.                 ra.writeChars(d2.name);// writeChars 将字符串写入
  14.                 ra.writeInt(d2.age);// weite为一个字节,WeiteInt是四个字节

  15.                 ra.writeChars(f3.name);// writeChars 将字符串写入
  16.                 ra.writeInt(f3.age);// weite为一个字节,WeiteInt是四个字节
  17.                 ra.close();// 关闭
  18.                 // 读取数据

  19.                 String strName = "";
  20.                 RandomAccessFile du = new RandomAccessFile("1.txt", "r");

  21.                 // 这里使用嵌套循环可以省点事
  22.                 for (int i = 0; i < 3; i++) {
  23.                         for (int j = 0; j < Employee.Len; j++) {
  24.                                 strName += du.readChar();
  25.                         }
  26.                         System.out.println(strName.trim() + ":" + du.readInt());// .trim去掉字符串中不可显示的字符
  27.                         strName = "";
  28.                 }

  29.                 du.close();// 关闭
  30.         }

  31. }

  32. class Employee {
  33.         public String name;
  34.         public int age;
  35.         public static final int Len = 10;

  36.         public Employee(String name, int age) {
  37.                 // 要先将name的值赋给this.name,再对this.name进行操作
  38.                 // 当局部变量和成员变量同名时,以this.成员变量区分
  39.                 this.name = name;
  40.                 this.age = age;
  41.                 if (this.name.length() > Len) {
  42.                         this.name.substring(0, Len);// 当员工姓名超过8个字符自动取8个字符,substring方法
  43.                 } else {
  44.                         while (this.name.length() < Len) {
  45.                                 this.name += "\u0000";
  46.                         }
  47.                 }
  48.         }
  49. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2