RandomAccessFile操作文件

1.RandomAccessFile不属于InputStream和OutputStream类系的。实际上,除了实现DataInput和DataOutput接口之外(DataInputStream和DataOutputStream也实现了这两个接口),它和这两个类系毫不相干,甚至不使用InputStream和OutputStream类中已经存在的任何功能;它是一个完全独立的类,所有方法(绝大多数都只属于它自己)都是从零开始写的。这可能是因为RandomAccessFile能在文件里面前后移动,所以它的行为与其它的I/O类有些根本性的不同。总而言之,它是一个直接继承Object的,独立的类,基本上,RandomAccessFile的工作方式是,把DataInputStream和DataOutputStream结合起来,再加上它自己的一些方法,比如定位用的getFilePointer( ),在文件里移动用的seek( ),以及判断文件大小的length( )、skipBytes()跳过多少字节数。此外,它的构造函数还要一个表示以只读方式("r"),还是以读写方式("rw")打开文件的参数 (和C的fopen( )一模一样)。它不支持只写文件。

2.RandomAccessFile常用构造函数

close()关闭此文件流并释放与该文件管理的所有系统资源
getFilePointer()返回此文件中的当前偏移量
length()返回此文件的长度
read()返回此文件的长度
read(byte[] b)将最多 b.length 个数据字节从此文件读入 byte 数组。
read(byte[] b, int off, int len)将最多 len 个数据字节从此文件读入 byte 数组
readInt()从此文件读取一个有符号的 32 位整数
readLine()从此文件读取文本的下一行
setLength(long newLength)设置此文件的长度
seek(long pos)设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作
tryLock获取文件锁

3.代码实例注意:这些方法只是常用的几个方法,如需更全面的方法请参考JAVA API

 public void readgclog(String path) throws FileNotFoundException 
 { 
    // 指定文件可读可写 
    final RandomAccessFile randomFile = new RandomAccessFile(new File( 
    "d:gc-hadoop.log"), "rw"); 
    // 启动一个线程每3秒钟读取新增的日志信息 
    ScheduledExecutorService exec = Executors.newScheduledThreadPool(1); 
    exec.scheduleWithFixedDelay(new Runnable() 
    {            
      public void run()
      { 
        try 
       { 
        int i = 0; 
        log.info("扫描中...."); 
        // 获得变化部分的 
        randomFile.seek(LASTTIMEFILESIZE); 
        String tmp = ""; 
        while ((tmp = randomFile.readLine()) != null) 
        { 
          LASTTIMEFILESIZE = randomFile.length(); 
          if (Check.notEmpty(tmp.trim())) 
          { 
             parselog.parselog(tmp); 
             i++; 
          } 
        } 
        // 以防日志从新生成 
        if (LASTTIMEFILESIZE > randomFile.length()) 
        { 
         LASTTIMEFILESIZE = 0; 
         log.info("日志从新生成,预读位置归零"); 
        } 
         log.info("共扫描到" + i + "条"); 
         log.info("扫描结束...."); 
     } catch (IOException e) 
    { 
       throw new RuntimeException(e); 
     } finally 
    { 
       try 
       { 
        randomFile.close(); 
        } catch (IOException e) 
       { 
        e.printStackTrace(); 
       } 
     } 
    } 
  }, 0, 3, TimeUnit.SECONDS); 
 }

 

转载于:https://my.oschina.net/zepinglidoc/blog/751664

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值