A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 Jiewin 于 2013-8-4 15:35 编辑
  1. import java.io.*;
  2. class RandomAccessFileDemo{
  3. public static void main(String[] args) throws IOException{
  4. writeFile();
  5. readFile();
  6. }

  7. public static void writeFile()throws IOException{
  8. RandomAccessFile raf = new RandomAccessFile("raf.txt","rw");
  9. raf.write("李四".getBytes());
  10. raf.writeInt(5);
  11. raf.write("张三疯".getBytes());
  12. raf.writeInt(99);

  13. raf.seek(8*3);
  14. raf.write("欧阳无敌".getBytes());
  15. raf.writeInt(101);
  16. }

  17. public static void readFile()throws IOException{
  18. RandomAccessFile raf = new RandomAccessFile("raf.txt","r");
  19. //raf.skipBytes(8*2);
  20. byte[] buf = new byte[4];
  21. raf.read(buf);
  22. String name = new String(buf);
  23. int age = raf.readInt();
  24. System.out.println("姓名:"+name);
  25. System.out.println("年龄:"+age);
  26. raf.close();
  27. }
  28. }
复制代码
文件的随机操作实例,如果姓名都是4个字节,没什么问题,但如果姓名有4个字的,还有更多~~年龄也有100岁以上的,那用哪个方法写入,读取呢?该怎么做?想了半天没想出来!

点评

应该用它的父类吧  发表于 2013-6-27 19:48

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

8 个回复

倒序浏览
本帖最后由 神之梦 于 2013-6-25 14:31 编辑

首先,年龄你读写都用int的话,占四个字节足够了
然后是姓名,这得根据最长姓名所占的长度来定。。。
一种办法是根据不去设定写入,只是在读取的时候,手动来定义buf的大小。
例如已知输入的是张三,那就定义buf=new byte[4];读下一个张三丰时,再定义buf=new byte[6];.............
还有一种就是,在写入的时候限定,如果输入姓名要占8个字节:
  1. import java.io.*;
  2. class RandomAccessFileDemo{
  3. public static void main(String[] args) throws IOException{
  4. writeFile();
  5. readFile();
  6. }

  7. public static void writeFile()throws IOException{
  8. RandomAccessFile raf = new RandomAccessFile("raf.txt","rw");
  9. raf.write("李四    ".getBytes());
  10. raf.writeInt(5);

  11. raf.write("张三疯  ".getBytes());
  12. raf.writeInt(99);

  13. raf.write("欧阳无敌".getBytes());
  14. raf.writeInt(101);
  15. }

  16. public static void readFile()throws IOException{
  17. RandomAccessFile raf = new RandomAccessFile("raf.txt","r");
  18. //raf.skipBytes(8*2);
  19. byte[] buf =new byte[8];
  20. while(raf.read(buf)!=-1)
  21. {
  22.         String name = new String(buf);
  23.         int age = raf.readInt();
  24.         System.out.println("姓名:"+name);
  25.         System.out.println("年龄:"+age);
  26. }
  27. raf.close();
  28. }
  29. }
复制代码
结果:
姓名:李四
年龄:5
姓名:张三疯
年龄:99
姓名:欧阳无敌
年龄:101

只是个人想法,帖出的代码为了方法,我就只在后面加空格表示,如果是给用户自己输的话,肯定不行,不过可以一开始就指定8个字节,如:String s="                ";

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
接二楼,解决的办法就是凑一个固定大小的字符串可以定义一个方法来判断用户输入的姓名是多大的,然后将其调整到固定大小,然后再存到文件用,如果考虑俄国人的话,咱就弄个15个字符的固定大小吧,代码如下:
  1. import java.io.*;

  2. public class RandomAccessFileDemo {
  3.         public static void main(String[] args) throws IOException {
  4.                 //writeFile();
  5.                 readFile();
  6.         }

  7.         public static void writeFile() throws IOException {
  8.                 RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw");
  9.                 //获得控制台输入流
  10.                 BufferedReader bfbr = new BufferedReader(new InputStreamReader(System.in));
  11.                 System.out.println("请输入用户名和年龄,以逗号隔开,结束请输入over");
  12.                
  13.                 String line = null;
  14.                 //可以无限输入
  15.                 while((line = bfbr.readLine()) != null){
  16.                         //结束标记
  17.                         if("over".equals(line.toLowerCase()))
  18.                                 break;
  19.                         String[] strs = line.split(",");
  20.                         raf.write(changeSize(strs[0]).getBytes());//写入changeSize函数返回的调好大小的姓名
  21.                         raf.writeInt(Integer.parseInt(strs[1].trim()));//用trim函数清除空格
  22.                 }
  23.                
  24.                 bfbr.close();
  25.                 raf.close();
  26.                
  27.         }

  28.         private static String changeSize(String string) {
  29.                 byte[] buf = string.getBytes();
  30.                 //System.out.println(buf.length);
  31.                 StringBuilder sb = new StringBuilder(string);
  32.                
  33.                 int x = (30 - buf.length)/2;//计算需要添加空格的次数
  34.                
  35.                 //添加空格一个空格对应一个字节
  36.                 for(int i=0; i<x; i++){
  37.                         sb.append("  ");
  38.                 }
  39.                
  40.                 String str = sb.toString();
  41.                 //System.out.println(str.getBytes().length);
  42.                 return str;
  43.         }

  44.         public static void readFile() throws IOException {
  45.                 RandomAccessFile raf = new RandomAccessFile("raf.txt", "r");
  46.                 // raf.skipBytes(8*2);
  47.                 byte[] buf = new byte[30];
  48.                 int len = 0;
  49.                 while((len = raf.read(buf)) != -1){
  50.                         String name = new String(buf, 0, len);
  51.                         int age = raf.readInt();
  52.                         System.out.println("姓名:" + name);
  53.                         System.out.println("年龄:" + age);
  54.                 }
  55.                
  56.                
  57.                 raf.close();
  58.         }
  59. }
复制代码
希望对楼主有帮助

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 很给力!

查看全部评分

回复 使用道具 举报
如果问题已解决,请把“未解决”改为“已解决”,如果没有,可继续追问,谢谢!
回复 使用道具 举报
liujkh123 发表于 2013-6-25 16:57
接二楼,解决的办法就是凑一个固定大小的字符串可以定义一个方法来判断用户输入的姓名是多大的,然后将其调 ...

我在NetBeans运行了,在  int age = raf.readInt(); 代码会报错
回复 使用道具 举报
本帖最后由 liujkh123 于 2013-7-3 15:56 编辑
汪平乐 发表于 2013-7-3 13:09
我在NetBeans运行了,在  int age = raf.readInt(); 代码会报错

这个程序我在Eclipse里边运行的时候是没有错误的,不知道你说的会报错是什么错误,能贴出来吗?我感觉最可能处的错误应该是字符编码的错误,所以还是要你把错误贴出来才能解决。
回复 使用道具 举报
liujkh123 发表于 2013-7-3 15:54
这个程序我在Eclipse里边运行的时候是没有错误的,不知道你说的会报错是什么错误,能贴出来吗?我感觉最可 ...

你Q多少?
我的是358998716-黑马汪平乐
回复 使用道具 举报
感谢几位大神的帮助,明白了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马