Java IO : RandomAccessFile

RandomAccessFile 类

【java】


RandomAccessFile 支持“随机访问”的方式,程序可以直接跳转到文件的任意地方来读写数据。即既支持读取文件内容,也支持向文件输出数据。

RandomAccessFile 对象包含了一个记录指针,用以标识当前读写处的位置,新创建一个RandomAccessFile对象时,该对象的文件记录指针位于0处,当读/写了n个字节后,文件记录指针将会向后移动n个字节。

操作文件记录指针的方法:

  • long getFilePointer() : 返回文件记录指针的当前位置。
  • void seek(long pos) : 将文件记录指针定位到pos位置。

**构造方法如下: **

public RandomAccessFile(String name, String mode) throws FileNotFoundException 
{
       this(name != null ? new File(name) : null, mode);
}
public RandomAccessFile(File file, String mode) {
	......
}

mode参数有以下值:

  • “r”: 只读,如果写报IOException。
  • “rw” : 读写,不存在就创建新文件
  • “rws”
  • “rwd”

访问指定内容

	public static void main(String[] args) throws IOException{
		RandomAccessFile raf =null; 
		try {
		//以只读方式打开一个RandomAccessFile对象
			raf = new RandomAccessFile("D:/ZhyTestSpace/testBase/src/test/java/testBase/RandomAccessFileTest.java", "r");
			System.out.println("RandomAccessFile的文件指针的初始位置:" + raf.getFilePointer());
			//移动文件指针的位置
			raf.seek(300);
			byte[] bbuf=new byte[1024]; 
			int hasRead = 0; 
			while ((hasRead = raf.read(bbuf)) > 0) {
				System.out.println(new String(bbuf,0,hasRead));
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} 
		finally {
			if (raf !=null){
				raf.close();
			}
		}
	}
}

向指定文件追加内容

public class RandomAccessFileTest {
	public static void main(String[] args) throws IOException{
		RandomAccessFile raf= null;
		
		try {
			raf = new RandomAccessFile("E:/javaFile/out.txt", "rw");
			raf.seek(raf.length());
			raf.write("追加的内容!\r\n".getBytes());
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		finally {
			if(raf !=null){
				raf.close();
			}
		}
	}
}

运行上面的程序,可以看到out.txt文件中多一行“追加的内容!”字符串。

向指定文件,指定位置插入内容

public class RandomAccessFileTest {
	public static void main(String[] args) throws IOException {
		insert("D:/ZhyTestSpace/testBase/src/test/java/testBase/RandomAccessFileTest.java", 400, "\r\n//这是新插入的文本内容哦!!!\r\n");
	}

	public static void insert(String fileName, long pos, String insertContent) throws IOException {
		RandomAccessFile raf = null;
		File file = new File("E:/javaFile");
		File tmp = File.createTempFile("tmp", null,file);
		FileOutputStream tmpOut = null;
		FileInputStream tmpIn = null;
		tmp.deleteOnExit();
		try {
			raf = new RandomAccessFile(fileName, "rw");
			tmpOut = new FileOutputStream(tmp);
			tmpIn = new FileInputStream(tmp);
			raf.seek(pos);
			// -----下面代码将插入点后的内容读入临时文件中保存-----
			byte[] bbuf = new byte[64];
			int hasRead = 0;
			while ((hasRead = raf.read(bbuf)) > 0) {
				// 将读取的数据写入临时文件
				tmpOut.write(bbuf, 0, hasRead);
			}
			// -----------下面代码插入内容------------
			// 把文件记录指针重新定位到pos位置
			raf.seek(pos);
			// 追加需要插入的内容
			raf.write(insertContent.getBytes());
			// 追加临时文件中的内容
			while ((hasRead = tmpIn.read(bbuf)) > 0) {
				raf.write(bbuf, 0, hasRead);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (raf != null) {
				raf.close();
			}
		}
	}

}

运行上面的程序,RandomAccessFile.java 文件将插入了一行字符串,上面程序,先使用了createTempFile() 方法创建了一个临时文件,用来保存被插入文件的插入点后面的内容。程序先将文件中插入点后的内容读入到临时文件中,接下来重新定位到插入点,将需要插入的内容添加到文件后面,最后再将临时文件的内容添加到文件后面,这样就达到了向指定文件、指定位置插入内容的效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值