日期:2014-05-16  浏览次数:20962 次

使用RandomAccessFile类-解决readLine乱码问题

RandomAccessFile

RandomAccessFile是用来访问那些保存数据记录的文件的,你就可以用seek( )方法来访问记录,并进行读写了。这些记录的大小不必相同;但是其大小和位置必须是可知的。但是该类仅限于操作文件。

RandomAccessFile不属于InputStream和OutputStream类系的。实际上,除了实现DataInput和DataOutput接口之外(DataInputStream和DataOutputStream也实现了这两个接口),它和这两个类系毫不相干,甚至不使用InputStream和OutputStream类中已经存在的任何功能;它是一个完全独立的类,所有方法(绝大多数都只属于它自己)都是从零开始写的。这可能是因为RandomAccessFile能在文件里面前后移动,所以它的行为与其它的I/O类有些根本性的不同。总而言之,它是一个直接继承Object的,独立的类。

基本上,RandomAccessFile的工作方式是,把DataInputStream和DataOutputStream结合起来,再加上它自己的一些方法,比如定位用的getFilePointer( ),在文件里移动用的seek( ),以及判断文件大小的length( )、skipBytes()跳过多少字节数。此外,它的构造函数还要一个表示以只读方式("r"),还是以读写方式("rw")打开文件的参数 (和C的fopen( )一模一样)。它不支持只写文件。

本人计划用RandomAccessFile类进行文件的读取,用于查找索引中记录的文件的位置。

但是遇到乱码的问题,后来解决了。

代码如下:

import java.io.*;

public class RandomFileAccessTest {

    public static void main(String[] args) throws IOException {
        long finishedFileSize = 1000 ;
        
        File newFile = new File("d:\\result.txt");
        //文件大小
        long fileSize = newFile.length();
        
        RandomAccessFile raf = new RandomAccessFile(newFile, "r");
        raf.seek(finishedFileSize);
        int offset = 500 ;
        //无乱码
//        byte[] b = new byte[1024];
//        raf.read(b, 0, offset);
//        System.out.println(new String(b));
        
        //返回1500,当前指针的位置。 1500 = 1000 + 500 = finishedFileSize + offset
//        System.out.println(raf.getFilePointer());
        
        //乱码 -- 解决了
        //在Windows下raf会默认编码成8859_1
        while(raf.read()!=-1){
            System.out.println(new String(raf.readLine().getBytes("8859_1"),"gbk"));
            System.out.println("current pointer offset:"+raf.getFilePointer());
        }
        
        raf.close();
    }

}

?