RandomAccessFile以字节方式读写文件,众所周知,计算机以二进制形式存储文件(包括视频,音频,文字等等),RandomAccessFile是以低八位一个字节读写,更准确的操作二进制文件,可以这么说,运用RandomAccessFile文件就可以任意的读取二进制文件了。
RandomAccessFile的构造方法

RandomAccessFile在文件随机访问操作时有两种模式,分别是只读模式和读写模式两种。在这里提供两种RandomAccessFile类构造方法,RandomAccessFile(File file ,String mode)和RandomAccessFile(String filename, String mode),第一个参数是需要访问的文件,第二个参数是访问模式。
如果mode是r则表示只读操作,如果是rw则表示读写操作。

package com.file;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

import org.junit.Test;
/**
 * 只读模式
 * RandomAccessFile(File file, String mode)
 * RandomAccessFile(String filename,String name)
 * RandomAccessFile构造方法第一个参数是要访问的文件,
 * 第二个参数是访问模式"r"表示只读模式
 * 
 */
public class TestRandomAccessFile {

	//如果访问的文件不存在则会抛出FileNotFoundException异常
	@Test
	public void testReadMode() throws FileNotFoundException{
		File file=new File("E:/test/test.txt");//获取文件对象
		String filename="E:/test/test.txt";//文件路径
		//创建随机读流
		RandomAccessFile raf=new RandomAccessFile(file,"r");
		RandomAccessFile raf1=new RandomAccessFile(filename, "r");
	}
	
	/**
	 * 读写模式
	 * RandomAccessFile(File file, String mode)
     * RandomAccessFile(String filename,String name)
     * RandomAccessFile构造方法第一个参数是要访问的文件,
     * 第二个参数是访问模式"rw"表示读写模式
	 * @throws IOException 
	 */
	@Test
	public void testReadWriteMode() throws IOException {
		File file=new File("E:/test/test.txt");
		String filename="E:/test/test.txt";
		RandomAccessFile raf=new RandomAccessFile(file,"rw");
		RandomAccessFile raf1=new RandomAccessFile(filename, "rw");
		raf1.close();
		raf.close();
	}//在读写模式下,若该文件不存在,写入数据时则会自动创建文件,若创建不成功,则抛出异常。
	
	/**
	 * RandomAccessFile写方法
	 * write(int d)方法,该方法只写参数int的"低8位"
	 * 其实只写int型参数的一个字节。
	 * @throws IOException 
	 */
	@Test
	public void testWrite() throws IOException {
		RandomAccessFile raf=new RandomAccessFile("E:/test/test.txt", "rw");
		raf.writeUTF("撒旦撒旦");
		raf.close();
	}
	
	/**
	 * RandomAccessFile写方法
	 * read()方法,该方法读取字节的方法,该方法读取一个buye(8位)填充到Int
	 * 如果放回-1表示读取到了文件的末尾。
	 * @throws IOException 
	 */
	
	@Test
	public void testRead() throws IOException {
		RandomAccessFile raf=new RandomAccessFile("E:/test/test.txt", "rw");
	    System.out.println(raf.readUTF());
	}
	/**
	 * read(byte[]b)可以从文件中批量读取字节的方法
	 * 该方法会从文件中尝试最多读取给定数组的总长度的字节量
	 * 并从给定的字节数组第一个位置开始,将读取到的字节顺序存放至数组中。
	 * 返回值为实际读取到的字节量即长度
	 * 通俗的讲就是该方法读取这么多字节数组所能装下的数据
	 * 
	 */
	@Test
	public void testReadByByteArray() throws IOException {
		RandomAccessFile raf=new RandomAccessFile("E:/test/test.txt", "rw");
		RandomAccessFile raf1=new RandomAccessFile("E:/test/test_copy.txt", "rw");
		byte[] b=new byte[1024*10];
		int len=-1;
		while((len=raf.read(b))!=-1) {
			raf1.write(b, 0, len);
		}
		raf1.close();
		raf.close();
	}
	
	/**
	 * RandomAccessFile的文件指针操作的方法
	 * 操作指针的位置,就可以任意的读写文件了
	 * 代码
	 * long getFilePointer()
	 * 该方法获取当前RandomAccessFile的指针位置
	 * @throws IOException 
	 * seek(long pos)该方法用于移动指针的位置.
	 */
	@Test
	public void testGetFilePointer() throws IOException {
		RandomAccessFile raf=new RandomAccessFile("E:/test/test.txt", "rw");
		System.out.println(raf.getFilePointer());//0
		raf.writeInt(1);
		System.out.println(raf.getFilePointer());//4
		raf.seek(2);
		System.out.println(raf.getFilePointer());//0
		raf.close();
	}
}