RandomAccessFile的总结

来源:互联网 发布:网络手游排行榜2015 编辑:程序博客网 时间:2024/05/19 18:17
最近学习了RandomAccessFile,对一些概念进行一个总结。
1,RandomAccessFile打开文件有两种模式:rw(读写)和r(只读),没有w(只写),因为写是要建立在读取的前提下的,没有读就不会有写。
2,RandomAccessFile在调用write()方法时,是按顺序将数据写入文件的,如果在读取数据时不按照写入的顺序读取就会读取出错误的数据。
3,write()方法是一次只能写入一个字节,而writeInt(int v)是一次性按照4个字节写入。对应write()方法,RandomAccessFile也有响应的read()方法,和write()方法一样,read()每次也只能从文件中读取一个字节,并以int值的形式返回,该int值只有低8位有效,若读取到文件末尾,即EOF,则返回-1。
4,将字符串写入文件需先将字符串转换为字节数组,调用字符串的getBytes(String charsetName)方法将字符串转换为字节数组strArr,然后调用RandomAccessFile的write(byte[] b)方法将字节数组写入文件。通常将字节数组的长度作为一个int值先于字节数组写入文件,在读取时可以根据这个int值来创建相应大小的字节数组
String str = "大家好!!!!!!!!!!!!!!!!!";byte[] strData = str.getBytes("UTF-8");raf.writeInt(strData.length);raf.write(strData);
读取文件中的字节数组可以调用read(byte[] b)方法,先创建一个字节数组strArr,通过调用read(strArr)方法将字节存入strArr中,再通过String的构造方法String(byte[] b,String charsetName),将字节数组转换为字符串
int lenth=raf.readInt();byte[] strData=new byte[lenth];raf.read(strData);String str=new String(strData,"UTF-8");System.out.println(str);
5,RandomAccessFile的对应基本数据类型的序列化方法有writeInt(int v),writeLong(long v),writeDouble(double v)等。
对应的RandomAccessFile的对应基本数据类型的反序列化方法有readInt(),readLong(),readDouble()等。
6,RandomAccessFile对文件的操作都是基于游标的,游标记录着文件当前写到或读到什么位置了。调用getFilePointer()方法可以获取游标当前的位置。调用seek(long pos)方法可以使游标移动到相应的位置以便我们对文件进行操作。
7,对于字符串的写入有一简便方法writeUTF(String str),但只限于UTF-8编码下的字符串。对于不是UTF-8编码的字符串就只能按照上面说过的方法来进行操作。
8,使用完必须将RandomAccessFile关闭,即调用close()方法
9,关于文件复制的操作,
import java.io.RandomAccessFile;/** * 复制文件 *  * @author Earl 2014-2-7下午03:26:13 *  */public class RandomAccessFileDemo06 {public static void main(String[] args)throws Exception {//用于读取源文件RandomAccessFile src=new RandomAccessFile("JDK.CHM","r");//用于写入目标文件RandomAccessFile des=new RandomAccessFile("JDKCOPY.CHM","rw");long start=System.currentTimeMillis();int d=-1;while((d=src.read())!=-1){des.write(d);}long end=System.currentTimeMillis();System.out.println("复制完毕");System.out.println("复制用时:"+(end-start));}}
以上代码是不使用缓冲数组的方法,该方法复制速度慢,下面使用带缓冲的方法
import java.io.RandomAccessFile;/** * 基于缓存的复制文件操作 *  * @author Earl 2014-2-7下午04:19:15 *  */public class RandomAccessFileDemo07 {public static void main(String[] args) throws Exception {RandomAccessFile src = new RandomAccessFile("JDK.CHM", "r");RandomAccessFile des = new RandomAccessFile("JDKCOPY2.CHM", "rw");// 创建一个字节数组byte[] buffer = new byte[1024 * 10];//并不是缓存区越大速度越快// 保存实际读取到的字节数int len = -1;long start=System.currentTimeMillis();while ((len = src.read(buffer)) > 0) {/* * void write(byte[] b,int start,int len): * 将给定的字节数组中从start处开始连续将len个字节写出 */des.write(buffer, 0, len);}long end=System.currentTimeMillis();System.out.println("复制完毕");System.out.println("用时"+(end-start)+"毫秒");src.close();des.close();}}



       

0 0
原创粉丝点击