1. RandomAccessFile类简介

  RandomAccessFile是Java提供用来访问一些保存数据记录的文件的类,可以进行读取操作,也可以进行写入操作,写入的数据则以byte的形式存储;支持随机访问,也就是可以访问文件的任意位置(通过文件指针实现)。

2. 构造函数

RandomAccessFile(String name, String mode)
RandomAccessFile(File file, String mode)

  两个构造函数用法非常相似,name、file都是用于指定打开的文件路径和名称,mode则是指定打开文件的方式,常用的参数有两个"r"和"rw",也就是只读和读写。

  文件打开后,文件指针指向文件最开始,也就是pointer=0,可通过RandomAccessFile了的getFilePointer()方法查看。

范例: 创建并打开一个数据文件。

//创建目录
File dir = new File("demo");
if (!dir.exists()) {
dir.mkdir();
}
//创建文件
File file = new File(dir, "test.dat");
if (!file.exists()) {
file.createNewFile();
}
//实例化RandomAccessFile对象
RandomAccessFile raf = new RandomAccessFile(file, "rw");
//打开文件时指针位置在最前,即0
System.out.println(raf.getFilePointer());

3. 写入操作

write(int i)
write(byte[] b)
write(byte[] b, int off, int len)

  第三个方法中的off为数组b中需要写入的数据的起始索引值,len则是要写入的长度。write方法每次写入一个字节,如果写入的数据超过一个字节,则写入后八位(如果这里不太理解,可看看:二进制运算基础)。

  另外,每写入一个字节,文件指针指向下一个字节。

范例: 通过write()方法向文件中写入一个整型数。(沿用上面例子创建的对象)

//write()方法每次只插入一个字节,大于一个字节的则写入后八位,因此写入一个整型数需要写入四次
int num = 28;
raf.write(num >>> 24);
raf.write(num >>> 16);
raf.write(num >>> 8);
raf.write(num);

  当然,RandomAccessFile类也提供了更简便的方法writeXxx(),如果插入一个整型,可直接writeInt(i);,boolean的则为writeBoolean(),以此类推。但是要清楚的是,这些方法的还是通过上面的write()方法实现的。

范例: 以下为RandomAccessFile类中writeInt()方法的方法体。

public final void writeInt(int v) throws IOException {
write((v >>> 24) & 0xFF);
write((v >>> 16) & 0xFF);
write((v >>> 8) & 0xFF);
write((v >>> 0) & 0xFF);
//written += 4;
}

4. 读取操作

read(int i)
read(byte[] b)
read(byte[] b, int off, int len)

  与写入操作类似,读取操作是通过read()方法实现的,每次读取一个字节,同时文件指针指向下一个位置(通过seek()方法将指针移到读取位置)。同时,RandomAccessFile类也封装了readXxx()系列方法用于简便读取,原理和使用方法可参考写入操作,基本类似。

范例: 将数据文件中的所有数据以整型形式读取出来。

//读取文件,在读取前需要通过seek()方法把文件指针移到最前
raf.seek(0);
for (int i = 0; i*4 < raf.length(); i++) {
System.out.println(raf.readInt());
}

5. 关闭文件

  打开的文件一定要通过close()关闭,否则可能会出现不可预料的错误。

6. 完整例子

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile; public class MyRandomAccessFile { public static void main(String[] args) throws IOException {
//创建目录
File dir = new File("demo");
if (!dir.exists()) {
dir.mkdir();
}
//创建文件
File file = new File(dir, "test.dat");
if (!file.exists()) {
file.createNewFile();
} //实例化RandomAccessFile对象
RandomAccessFile raf = new RandomAccessFile(file, "rw");
//打开文件时指针位置在最前,即0
System.out.println(raf.getFilePointer()); //写入数据
int[] num = {28, 14, 56, 23, 98};
for (int i : num) {
raf.writeInt(i);
} //读取文件,在读取前需要通过seek()方法把文件指针移到最前
raf.seek(0);
for (int i = 0; i*4 < raf.length(); i++) {
System.out.println(raf.readInt());
} //操作结束后一定要关闭文件
raf.close();
}
}

使用RandomAccessFile类对文件进行读写的更多相关文章

  1. RandomAccessFile类——高效快捷地读写文件

    RandomAceessFile类 RandomAccessFile类是一个专门读写文件的类,封装了基本的IO流,在读写文件内容方面比常规IO流更方便.更灵活.但也仅限于读写文件,无法像IO流一样,可 ...

  2. C# 运用StreamReader类和StreamWriter类实现文件的读写操作

    对文件的读写操作应该是最重要的文件操作,System.IO命名空间为我们提供了诸多文件读写操作类,在这里我要向大家介绍最常用也是最基本的StreamReader类和StreamWriter类.从这两个 ...

  3. Java基础 使用转换流进行文件的复制 / RandomAccessFile 类进行文件的复制

    笔记:  **使用转换流进行文件的复制 文本文件---字节流FileInputStream--> [InputStreamReader] -----字符流BufferedReader------ ...

  4. RandomAccessFile类进行文件加密

    文件加密/解密示例. package io; import java.io.*; public class encrypt { private File file; //存储文件对象信息 byte[] ...

  5. 在对文件进行随机读写,RandomAccessFile类,如何提高其效率

    花1K内存实现高效I/O的RandomAccessFile类 JAVA的文件随机存取类(RandomAccessFile)的I/O效率较低.通过分析其中原因,提出解决方案.逐步展示如何创建具备缓存读写 ...

  6. 通过扩展RandomAccessFile类使之具备Buffer改善I/O性能--转载

    主体: 目前最流行的J2SDK版本是1.3系列.使用该版本的开发人员需文件随机存取,就得使用RandomAccessFile类.其I/O性能较之其它常用开发语言的同类性能差距甚远,严重影响程序的运行效 ...

  7. 【Java IO流】RandomAccessFile类的使用

    RandomAccessFile类的使用 RandomAccessFile类是java提供的对文件内容的访问,既可以读文件,也可以写文件. 支持随机访问文件,可以访问文件的任意位置. RandomAc ...

  8. 文件随机读写专用类——RandomAccessFile

     RandomAccessFile类可以随机读取文件,但是在测试中并不好用;File类可以测试文件存不存在,不存在可以创建文件;FileWriter类可以对文件进行重写或者追加内容;FileReade ...

  9. File文件的读写操作RandomAccessFile类

    1.Java提供了一个对文件随机访问的操作,访问包括读和写操作,该类名是RandomAccessFile,该类的读写是基于指针的操作. 2.RandomAccessFile在堆文件进行随机访问操作时有 ...

随机推荐

  1. 调用android方法,出现版本太低解决方法

    原因如下图所示: 调用需要API级别11,当前是8. 解决方法如下图所示: 点击

  2. Java设计模式之接口型模式总结

    摘要: 原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6508967.html 之前认真学习了Java设计模式中的四大接口型模式,分别为:适 ...

  3. smarty模板调数据库并做添加删除修改和分页

    smarty模板只要就是实现分离效果所以每个功能都需要两个页面一个是HTML  和 PHP  两部分组成 使用smarty模板要在main文件夹下面创建login.php文本,要用smarty模板首先 ...

  4. 轻松理解JavaScript闭包

    摘要 闭包机制是JavaScript的重点和难点,本文希望能帮助大家轻松的学习闭包 一.什么是闭包? 闭包就是可以访问另一个函数作用域中变量的函数. 下面列举出常见的闭包实现方式,以例子讲解闭包概念 ...

  5. 剑指offer_(17)

    题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) public class Solution17 { /*思路:参考剑指offer 1.首先设置标志 ...

  6. ST Lab1 junit test

    代码地址:  https://github.com/newff/st-lab1 Tasks: Install Junit(4.12), Hamcrest(1.3) with Eclipse Insta ...

  7. 一个小时学会jQuery

    前一段时间录了一套关于jQuery的视频分享给大家,可以在下载区下载到,本来想配合文字一起的,后面发现视频+帮助文档也是非常好的学习方法. 一.jQuery简介与第一个jQuery程序 1.1.jQu ...

  8. Redis命令总结及其基础知识讲述

    1.redis的不同之处 Redis拥有其他数据库不具备的数据结构,又拥有内存存储(这使得redis的速度非常快),远程操作(使得redis可以与多个客户端和服务器进行连接).持久化(使得服务器可以在 ...

  9. mybatis 使用@Select 注解,因为字符编码不一致导致mybatis 报错

    使用 mybatis 的@Select 注解, @Select({ "<script>select " + ALL_COLUMNS + " from &quo ...

  10. mysql索引使用技巧及注意事项

    一.索引的作用 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重. 在数据 ...