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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© dolphin 中级黑马   /  2013-10-12 03:33  /  1301 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 dolphin 于 2013-10-16 09:38 编辑

RandomAccessFile中提到对指针的操作,我理解不够,还希望大家多给我讲讲啊,先谢谢了!

评分

参与人数 1技术分 +1 黑马币 +3 收起 理由
李江 + 1 + 3

查看全部评分

2 个回复

倒序浏览
这是我对这个类的理解:自成一派的工具类RandomAccessFile
(1)这哥们帮派没混下去,直接继承的Object,它不属于IO体系,但是它归属与IO包。
         它既能读,又能写。它内部封装了数组,并且通过指针对数组元素进行操作!
(2)RandomAccessFile可以通过getFilePointer()方法获取指针位置,还可以通过seek()方法改变
         指针位置。skipBytes(int n)跳过多少个字节读取。不能往回跳。       
(3)其实完成读写的原理就是内部封装了输入字节流和输出字节流!
(4)通过构造函数,可以看出RandomAccessFile有个很大的局限性:只能操作文件!设备只有磁盘上的文件。
         内存,键盘,控制台等等设备一律不能操作。
         RandomAccessFile(String fileName,String mode);
         RandomAccessFile(File file,String mode);
         模式 r:只读 rw:读写
(5)方法包含了InputStream和OutputStream的所有方法,还添加了读写基本数据类型的方法。
         以及比较特殊的seek()方法,getFilepointer()方法等等。
         方法结束时候需要关闭流close()方法。
(6)可以在文件中的任何地方写入数据(seek()方法),原位置的数据被覆盖。
         RandomAccessFile对象在创建的时候如果模式为rw:若关联文件不存在,会自动创建,若已存在,不会覆盖原有文件!
         RandomAccessFile对象在创建的时候如果模式为r: 若关联文件不存在,不会自动创建文件,会爆异常!
(7)可以利用与线程结合的方法,一个线程负责一段的方式,分段式的录入数据,相互不冲突。(下载文件的原理)
         数据要分段,希望数据有规律,便于操作。
然后我结合多线程的知识写了个小程序,就是在一个文件中拼诗歌,希望对你有帮助^^
  1.   /**
  2.          * RandomAccessFile与多线程结合完成诗歌的拼写
  3.          * @author lt
  4.          */
  5.         import java.io.FileNotFoundException;
  6.         import java.io.IOException;
  7.         import java.io.RandomAccessFile;

  8.         public class RandomAccessFileDemo2 {
  9.                
  10.                 public static void main(String[] args) {
  11.                         RandomAccessFile raf = null;
  12.                         try {
  13.                                 raf = new RandomAccessFile("d:\\test.txt","rw");
  14.                         } catch (FileNotFoundException e) {
  15.                                 e.printStackTrace();
  16.                         }
  17.                         WriteThread1 wt1 = new RandomAccessFileDemo2().new WriteThread1(raf);
  18.                         WriteThread2 wt2 = new RandomAccessFileDemo2().new WriteThread2(raf);
  19.                         WriteThread3 wt3 = new RandomAccessFileDemo2().new WriteThread3(raf);
  20.                         new Thread(wt1).start();
  21.                         new Thread(wt2).start();
  22.                         new Thread(wt3).start();
  23.                 }
  24.                
  25.                 public class WriteThread1 implements Runnable{
  26.                         RandomAccessFile raf = null;
  27.                         public WriteThread1(RandomAccessFile raf){
  28.                                 this.raf = raf;
  29.                         }
  30.                         @Override
  31.                         public void run() {
  32.                                 System.out.println("线程1已经启动!");
  33.                                 //窗前明月光,疑是地上霜。一共22位
  34.                                 try {
  35.                                         String s = "床前明月光,疑是地上霜.";
  36.                                         raf.seek(22*0);
  37.                                         raf.write(s.getBytes());
  38.                                 } catch (IOException e) {
  39.                                         e.printStackTrace();
  40.                                 }
  41.                         }
  42.                 }
  43.                 public class WriteThread2 implements Runnable{
  44.                         RandomAccessFile raf = null;
  45.                         public WriteThread2(RandomAccessFile raf){
  46.                                 this.raf = raf;
  47.                         }
  48.                         @Override
  49.                         public void run() {
  50.                                 System.out.println("线程2已经启动!");
  51.                                 try {
  52.                                         String s = "举头望明月,低头思故乡.";
  53.                                         raf.seek(22*1);
  54.                                         raf.write(s.getBytes());
  55.                                 } catch (IOException e) {
  56.                                         e.printStackTrace();
  57.                                 }
  58.                         }
  59.                 }
  60.                 public class WriteThread3 implements Runnable{
  61.                         RandomAccessFile raf = null;
  62.                         public WriteThread3(RandomAccessFile raf){
  63.                                 this.raf = raf;
  64.                         }
  65.                         @Override
  66.                         public void run() {
  67.                                 System.out.println("线程3已经启动!");
  68.                                 try {
  69.                                         String s = "好诗好诗~";
  70.                                         raf.seek(22*2);
  71.                                         raf.write(s.getBytes());
  72.                                 } catch (IOException e) {
  73.                                         e.printStackTrace();
  74.                                 }
  75.                         }
  76.                 }
  77.         }
复制代码

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1

查看全部评分

回复 使用道具 举报
To 金牌黑马 2013-10-15 18:05:24
藤椅
楼主你好,如果问题已解决请将帖子状态修改为提问结束,如果未解决请继续提问,谢谢合作
如果不会修改请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马