随机读写是相对顺序读写而言的,所谓随机读写,是指可以在任何时候将存取文件的指针指向文件内容的任何位置。假设存在一个文件尺寸为1024个字节的文件,如果按照顺序存取原则的话,我们只能采用类似于FileStream.read()或者FileReader.readLine()的方式来一段一段,或者一行一行地读取,在多数情况下,这样仿佛没有问题。但是,请考虑下面两个场景:
数据不是整体传输,而是分块传输的:请注意,一般意义上的分块传输,数据块到达接收方(或者说被接收方接受下来)的顺序是不可预料的。一般的多线程下载软件(如网络蚂蚁),采取的做法都是启动多个线程分工抓取网络资源文件的不同分段,在此过程中,哪个数据块先被下载软件接受,那块数据后被接受,是不可预料的。
在一个大文件中快速定位:有事,我们很明确自己想读取的内容唉整个文件中的位置,例如,在一个尺寸达到2GB的文件中读取第1024*1024个字节。
以上场景不是顺序存取所擅长的。自然,不是顺序存取完全无能为力,只是代价和效率令人难以接受。
在java中,随机读写是通过java.io.RandomAccessFile类实现的。以下代码片段以随机文件方式创建一个文件,指定其尺寸是1024kb:
private void createFile(String filePath)throws IOException
{
File newFile=new File(filePath);
RandomAccessFile raf=new RandomAccessFile(newFile,"rw");
raf.setLength(1024*1024);
raf.close();
}
RandomAccessFile类的核心价值在于RandomAccessFile.seek()方法,通过这个方法,可以任意地指定当前存取文件的指针位置。下面的代码片段实现功能:在filePath文件的finishedFileSize个字节后写入bytes字节数组中的realLength个字节的数据:
private void writeIntoFIle(String filePath,byte[] bytes,int realLength,int finishedFileSize) throws IOException
{
File newFile=new File(filePath);
RandomAccessFile raf=new RandomAccessFile(newFIle,"rw");
raf.seek(finishedFileSize);
raf.write(bytes,0,realLength);
raf.close();
}
可以随时调用RandomAccessFile类的getFilePionter()方法,获取文件指针当前距离文件起始位置的偏移量。