Java RandomAccessFile文件操作详解
2015-07-31 06:38
776 查看
简介:
RandomAccessFile类可以对文件随机访问的操作,访问包括读和写操作。该类的读写是基于指针的操作。
RandomAccessFile对文件进行随机访问操作时有两个模式,一种是只读(r),另一种是读写(rw),需在创建RandomAccessFile对象时传入一个参数进行设置,第一个参数代表要访问的文件,第二个参数代表设置访问模式
RandomAccessFile(File file,String mode)
RandomAccessFile(String filename,String mode)
只读模式: new RandomAccessFile(“filename”,”r”);
读写模式: new RandomAccessFile(filename,”rw”);
运行结果:
this is a demo!
RandomAccessFile常用方法汇总:
void write(int d)
该方法会根据当前指针所在位置处写入一个字节,是将参数int的”低8位”写出
int read()
如果返回-1表示读取到了文件末尾EOF(EOF:End Of File)! 每次读取后自动移动文件指针, 准备下次读取。
void write(byte[] d)
根据当前指针所在位置处连续写出给定数组中的所有字节
void write(byte[] d,int offset,int len)
根据当前指针所在位置处连续写出给定数组中的部分字节,这个部分是从数组的offset处开始,连续len个字节
int read(byte[] b)
从文件中尝试最多读取给定数组的总长度的字节量,并从给定的字节数组第一个位置开始,将读取到的字节顺序存放至数组中,返回值为实际读取到的字节量
void close()
RandomAccessFile在对文件访问的操作全部结束后,要调用close()方法来释放与其关联的所有系统资源
运行结果:
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
读取结束,len=-1
文件指针操作:
RandomAccessFile的读写操作都是基于指针的,也就是说总是在指针当前所指向的位置进行读写操作。
long getFilePointer()
获取当前指针位置
void seek(long pos)
使用该方法可以移动指针到指定位置。
int skipBytes(int n)
尝试跳过输入的 n 个字节以丢弃跳过的字节
实现文件追加:
运行后test.dat文本内容:
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
追加后的文本
总结:
RandomAccessFile,优点是可以控制指针的位置,对文件进行指定位置的读写操作。
但是同时也有一些缺点,执行效率比较慢,大量进行指针控制操作很耗内存。
RandomAccessFile类可以对文件随机访问的操作,访问包括读和写操作。该类的读写是基于指针的操作。
RandomAccessFile对文件进行随机访问操作时有两个模式,一种是只读(r),另一种是读写(rw),需在创建RandomAccessFile对象时传入一个参数进行设置,第一个参数代表要访问的文件,第二个参数代表设置访问模式
RandomAccessFile(File file,String mode)
RandomAccessFile(String filename,String mode)
只读模式: new RandomAccessFile(“filename”,”r”);
读写模式: new RandomAccessFile(filename,”rw”);
public static void main(String[] args) throws IOException { //以读写方式打开并写入一行文本 File fis = new File("test.date"); RandomAccessFile raf = new RandomAccessFile(fis, "rw"); byte[] writeStr = "this is a demo!".getBytes(); raf.write(writeStr); raf.close(); //以只读方式打开并读取一行数据 RandomAccessFile rafRead = new RandomAccessFile("test.date", "r"); System.out.println(rafRead.readLine()); rafRead.close(); }
运行结果:
this is a demo!
RandomAccessFile常用方法汇总:
void write(int d)
该方法会根据当前指针所在位置处写入一个字节,是将参数int的”低8位”写出
int read()
如果返回-1表示读取到了文件末尾EOF(EOF:End Of File)! 每次读取后自动移动文件指针, 准备下次读取。
void write(byte[] d)
根据当前指针所在位置处连续写出给定数组中的所有字节
void write(byte[] d,int offset,int len)
根据当前指针所在位置处连续写出给定数组中的部分字节,这个部分是从数组的offset处开始,连续len个字节
int read(byte[] b)
从文件中尝试最多读取给定数组的总长度的字节量,并从给定的字节数组第一个位置开始,将读取到的字节顺序存放至数组中,返回值为实际读取到的字节量
void close()
RandomAccessFile在对文件访问的操作全部结束后,要调用close()方法来释放与其关联的所有系统资源
public static void main(String[] args) throws IOException { //以读写方式打开并写入一行文本 File fis = new File("test.dat"); RandomAccessFile rafw = new RandomAccessFile(fis, "rw"); byte[] writeStr = "this is a demo!\n".getBytes(); for(int i = 0; i < 10; i++) { rafw.write(writeStr, 0, writeStr.length); } rafw.close(); //以只读方式打开test.dat RandomAccessFile rafr = new RandomAccessFile(fis, "r"); byte[] rd = new byte[1024]; int len = -1; //循环读取,读到结束后len被重新赋值为-1 while((len = rafr.read(rd))!= -1) { System.out.println(new String(rd)); } System.out.println("读取结束,len="+len); rafr.close(); }
运行结果:
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
读取结束,len=-1
文件指针操作:
RandomAccessFile的读写操作都是基于指针的,也就是说总是在指针当前所指向的位置进行读写操作。
long getFilePointer()
获取当前指针位置
void seek(long pos)
使用该方法可以移动指针到指定位置。
int skipBytes(int n)
尝试跳过输入的 n 个字节以丢弃跳过的字节
实现文件追加:
public static void main(String[] args) throws IOException { RandomAccessFile raf = new RandomAccessFile("test.dat", "rw"); //将记录指针移动到文件最后 ,进行追加操作 raf.seek(raf.length()); raf.write("追加后的文本\n".getBytes()); raf.close(); }
运行后test.dat文本内容:
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
追加后的文本
总结:
RandomAccessFile,优点是可以控制指针的位置,对文件进行指定位置的读写操作。
但是同时也有一些缺点,执行效率比较慢,大量进行指针控制操作很耗内存。
相关文章推荐
- java培训 2015-07-30
- (二)八中基本数据类型
- (一)java变量
- 11_Eclipse中演示Git版本的创建,历史版本的修改,创建分支,合并历史版本和当前版本
- 转:java实现三个线程A B C,A线程打印A之后才能B线程打印B,然后接着C线程执行打印C,继而循环下去
- js中java式的类成员
- struts框架中的result
- Spring3.2与Struts2的整合环境
- Struts2学习笔记(二)数据驱动与struts.xml配置
- springMVC --@RequestParam注解(后台控制器获取参数)
- Java抽象类总结
- java中打印数组的5种方法
- javaweb写的在线聊天应用
- Spring MVC集成slf4j-logback
- springMVC --配置详细与注解说明
- Java多线程初探--基础篇
- 【SpringMVC架构】SpringMVC入门实例,解析工作原理(二)
- 【SpringMVC架构】SpringMVC入门实例,解析工作原理(二)
- spring mail 发送邮件
- Spring classpath:与classpath*:的区别