添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

【1】RandomAccessFile基本概念

RandomAccessFile主要完成随机读取的功能,可以读取指定位置的内容。不属于InputStream和OutputStream类系的。

实际上,除了实现DataInput和DataOutput接口之外(DataInputStream和DataOutputStream也实现了这两个接口),它和这两个类系毫不相干,甚至不使用InputStream和OutputStream类中已经存在的任何功能。

它是一个完全独立的类,所有方法(绝大多数都只属于它自己)都是从零开始写的。这可能是因为RandomAccessFile能在文件里面前后移动,所以它的行为与其它的I/O类有些根本性的不同。

RandomAccessFile的工作方式

把DataInputStream和DataOutputStream结合起来,再加上它自己的一些方法。

比如定位用的getFilePointer( ),在文件里移动用的seek( ),以及判断文件大小的length( )、skipBytes()跳过多少字节数。

此外,它的构造函数还要一个表示以只读方式(“r”),还是以读写方式(“rw”)打开文件的参数 (和C的fopen( )一模一样)。

需要注意的是,它不支持只写文件。

只有RandomAccessFile才有seek搜寻方法,而这个方法也只适用于文件。

BufferedInputStream有一个mark( )方法,你可以用它来设定标记(把结果保存在一个内部变量里),然后再调用reset( )返回这个位置,但是它的功能太弱了,而且也不怎么实用。

public class RandomAccessFile implements DataOutput, DataInput, Closeable {
	//...

RandomAccessFile 类支持 “随机访问” 的方式,程序可以直接跳到文件的任意地方来读、写文件。

  • 支持只访问文件的部分内容;
  • 可以向已存在的文件后追加内容;

RandomAccessFile 对象包含一个记录指针,用以标示当前读写处的位置。RandomAccessFile 类对象可以自由移动记录指针:

long getFilePointer():获取文件记录指针的当前位置
void seek(long pos):将文件记录指针定位到 pos 位置
public RandomAccessFile(File file, String mode) 
public RandomAccessFile(String name, String mode)

创建 RandomAccessFile 类实例需要指定一个 mode 参数,该参数指定 。

RandomAccessFile 的访问模式(mode):

r: 以只读方式打开
rw:打开以便读取和写入
rwd:打开以便读取和写入;同步文件内容的更新
rws:打开以便读取和写入;同步文件内容和元数据的更新

【2】文件的读写与复制

实例代码如下:

	@Test
	public void testRandomAccessFile(){
		RandomAccessFile rFile1 = null;
		RandomAccessFile rFile2 = null;
		try {
			/*相对于项目路径--contextPath路径*/
			File file1 = new File("test1.txt");
			File file2 = new File("test3.txt");
			/* rw 读写模式*/
			rFile1 = new RandomAccessFile(file1, "rw");
			rFile2 = new RandomAccessFile(file2, "rw");
			int len = 0;
			byte[] b = new byte[1024];
			/*--读入到byte数组并进行输出--*/
			while ((len = rFile1.read(b)) !=-1) {
				System.out.println("ASCII :"+len+"value :"+new String(b,0,len));//new String() turn to be String
				/*写入到另一个文件*/
				rFile2.write(b, 0, len);
		}catch (IOException e) {
			e.printStackTrace();

【3】输出文件的大小

test1.txt文件内容:123456我们要有梦想

System.out.println(rFile1.length());

24bytes—24个字节
这里写图片描述

【4】跳到指定位置读取文件

seek(long a)是定位文件指针在文件中的位置。

参数a确定读写位置距离文件开头的字节个数,比如seek(0)就是定位文件指针在开始位置,其是绝对定位。

rFile1.seek(1);//从第二个字节开始

实例代码如下:

	RandomAccessFile raf = new RandomAccessFile(“test.txt”, “rw”);
    raf.seek(5);
	byte [] b = new byte[1024];
	int off = 0;
	int len = 5;
	raf.read(b, off, len);
	String str = new String(b, 0, len);
	System.out.println(str);
	raf.close();

【5】跳过指定字节

skipBytes()是指在文件中跳过给定数量的字节,其是相对定位。

构造函数: **RandomAccessFile(File file, String mode):**创建从中读取和向其中写入(可选)的随机访问文件流,该文件File 参数指定。 **RandomAccessFile(String name, String mode)
RandomAccessFile(String path,String mode) ② RandomAccessFile(File file,String mode) 第一个参数是要操作文件,可以直接给路径,或者指定一个file对象。 第二个参数是操作模式,r --只读模式;rw --读写模式; 2、r和rw模式的区别? 创建RAF时,若指定的文件不存在,则
RandomAccessFile适用于大小已知的记录组成的文件,提供的对文件访问,既可以读文件,也可以写文件,并且支持随机访问文件,可以访问文件的任意位置。文件中记录的大小不一定都相同,只要我们知道记录的大小和位置。但是该类仅限于操作文件RandomAccessFile不属于InputStream和OutputStream继承层次结构中的一部分。除了实现DataInput和DataOut...
RandomAccessFile的简介 我们平常创建流对象关联文件,开始读文件或者写文件都是从头开始的,不能从中间开始,如果是开多线程下载一个文件我们之前学过的FileWriter或者FileReader等等都无法完成,而当前介绍的RandomAccessFile他就可以解决这个问题,因为它可以指定位置读,指定位置写的一个类,通常开发过程中,多用于多线程下载一个大文件 常用方法简介 构造方法:Ra...