读取文件任意位置的内容——RandomAccessFile

时间:2022-04-07 16:03:32

http://www.cnblogs.com/Sunw/p/3801145.html

http://www.cnblogs.com/dukc/p/4776868.html

http://www.cnblogs.com/zhujiabin/p/5660541.html

总结

  1、构造方法:RandomAccessFile有两个构造方法

    (1) RandomAccessFile(File file, String mode)

    (2) RandomAccessFile(String filepath, String mode)

    mode参数表示打开文件方式,其值及含义如下:

含意

"r" 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException
"rw" 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。
"rws" 打开以便读取和写入,对于 "rw",还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。
"rwd" 打开以便读取和写入,对于 "rw",还要求对文件内容的每个更新都同步写入到底层存储设备。

  2、文件长度属性:同java.io.File对象一样的length

  3、指针定位方法:

    public void seek(long pos) throws IOException {}
    参数pos - 从文件开头以字节为单位测量的偏移量位置,在该位置设置文件指针。

    (1) pos位于 [0, length] 之间,超出范围则报错;

    (2) 一般在读取文件时,不要将pos指向length,因为pos指向length表示文件已读完,这时再调用read方法则会抛出异常,如果是反向读取文件,可以设置pos=length-1,这表示下一次read得到的事最后一个字符;

    (3) 定义了多种read方法,用于读取不同类型的数据,具体请查看API

  4、读取文件时要注意指针位置

    (1) 指针自动移动:每次调用read的时候,指针pos会自动移动到read的数据之后,这就表示,如果需要重复read某一段数据,那么每次read前都要手动调用一次seek(pos)方法;

    (2) 反向读取需注意:在反向读取文件时,我这里使用了 if(logFile.readByte() == '\n') {} 来判断是否读取到了换行符,由于(1)的关系,在执行这个if之后,指针向后移动了一个字节长度,所以在if块中,我们可以直接调用readLine来获取下一行的数据,也正因为如此,我们在这个if块中,只能获取到前面存在换行符'\n'的数据,这就表明了,这里面永远不可能获取到第一行的数据(因为第一行前面没有行了,也就没有换行符'\n'了),所以这里对首行数据进行单独读取。

    (3) 空行处理:line = logFile.readLine(); 如果读取了空行,则这里 line = null; (个人认为这是不对,原因很简单:既然是空行,就表示存在这个行,只是没有数据而已,所以个人认为应该是 "" 而不是 null);所以在这里不要直接使用line,小心报NullPointException哦;

    (4) 字符集问题:readLine()存在中文乱码问题;我没有深入研究过是否能直接read中文,这里只是对read结果做了简单处理,如果你有更好的中文乱码解决方案,也请你能留言告诉我。