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);
}