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