RandomAccessFile随机访问文件

打开一个随机访问文件


当我们用二进制写入文件时,我们只能将数据一个一个的读取出来,那么有什么办法可以让我们可以随心所欲的读取我们需要的数据呢,RandomAccessFile类很好地解决了这个问题,它可以在文件中的任何位置查找或写入数据。

               RandomAccessFile in = new RandomAccessFile("文件名","r");//只读
               RandomAccessFile inOut = new RandomAccessFile("文件名","rw");//读写

ps:当你将已有文件作为RandomAccessFile打开时,这个文件并不会被删除

RandomAccessFile类




所有已实现的接口:
CloseableDataInputDataOutput

意味着RandomAccessFile对象可以使用诸如readInt/writeInt/readChar/writeChar等方法来进行读入写出操作



  • 随机访问文件具有一个表示下一个将被操作的字节所处位置的文件指针,seek方法可以用来部署seek指针的位置:
seek方法:



public void seek(long pos)
          throws IOException

设置到此文件开头测量到的文件指针偏移量(位置),在该位置发生下一个读取或写入操作。偏移量的设置可能会超出文件末尾。偏移量的设置超出文件末尾不会改变文件的长度。只有在偏移量的设置超出文件末尾的情况下对文件进行写入才会更改其长度。
参数:
pos - 从文件开头以字节为单位测量的偏移量位置,在该位置设置文件指针。
抛出:
IOException - 如果 pos 小于 0 或者发生 I/O 错误。 



  • 想要确定文件指针的位置可以使用getFilePointer方法:

getFilePointer方法:


public long getFilePointer()
                    throws IOException

返回文件指针中的当前偏移量(位置)。
返回:
到此文件开头的偏移量(以字节为单位),在该位置发生下一个读取或写入操作。
抛出:
IOException - 如果发生 I/O 错误。





  • 要确定文件中的字节总数可以使用length方法:

length

public long length()
            throws IOException
返回此文件的长度。
返回:
按字节测量的此文件的长度。
抛出:
IOException - 如果发生 I/O 错误


使用方法


我们现在可以通过seek方法来调度文件指针以便取得自己想要的数据,但文件都是以二进制格式来保存的,我们如何才能得到自己想要的数据的位置呢?

比如有一个员工类Employee它的字段(属性)包括:
(String)name,(double)salary,(LocalDate) hireDay,

我们创建n个Employee类的实例并保存在.dat文件中,我们只需保证每个实例的字节长度相同就可以通过seek找到相应的实例:

RandomAccessFile in = new RandomAccessFile("XXX.dat","r");
in.seek((n-1)*RECORD_SIZE);

整数和浮点值在二进制格式中都具有固定的尺寸(int 4字节,double 8字节),但在处理字符串时就有些棘手了,于是我们使用下面两个助手方法来读写具有固定长度的字符串:

//写出字符串
public static void writeFixedString(String s,int size,DataOutput out) throws IOException{
for(int i=0;i<size;i++) {
char ch=0;
if(i<s.length()) ch=s.charAt(i);
out.writeChar(ch);
}
}

//读入字符串
public static String readFixedString(int size,DataInput in) throws IOException{
StringBuilder b=new StringBuilder(size);
boolean more=true;
int i=0;
while(more&&i<size) {
char ch=in.readChar();
i++;
if(ch==0) more=false;
else b.append(ch);
}
in.skipBytes(2*(size-i));
return b.toString();
}

最后

磁盘文件都是随机访问的,但是网络套接字通信的输入/输出流却不是。

本文只供学习交流之用,尊重他人劳动成果,转载请注明出处。

Comments

Popular posts from this blog

HTTP协议特性

操作文件

接口