IOの随机流

随机存取文件流

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

支持只访问的部分内容

可以向已存在的文件后追加内容

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

long getFilePointer():获取文件记录指针的当前位置

void seek(long pos):将文件记录指针定位到pos位置

构造器

public RandomAccessFile(File file,String mode)

public RandomAccessFile(String name,String mode)

mode有四种:

r:以只读方式打开

rw打开以便读取和写入

rwd打开以便读取和写入:同步文件内容的更新

rws打开以便读取和写入:同步文件内容和元数据的更新

package IO;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.concurrent.locks.ReadWriteLock;

import org.junit.Test;

/*
 * RandomAccessFile:支持随机访问
 * 1.既可以充当一个输入流,又可以充当一个输出流
 * 2.支持从文件的开头读取、写入
 * 3.支持从任意位置读取或写入(插入)
 * */
public class TestRandomAccessFile {
	// 重构test3使得插入更通用(不止是一行的,整个文章的特定位置插入)
	@Test
	public void test4() {
		RandomAccessFile randomAccessFile = null;
		try {
			randomAccessFile = new RandomAccessFile(new File("HelloIO"), "rw");
			randomAccessFile.seek(3);

			// String string = randomAccessFile.readLine();
			// 将文章后面的字节,以每10个为单位添加到sb中
			StringBuffer sBuffer = new StringBuffer();
			byte[] bs = new byte[10];
			int len;
			while ((len = randomAccessFile.read(bs)) != -1) {
				// sBuffer.append(bs);//不对,因为bs是字节数组,而append参数应该是字符串
				sBuffer.append(new String(bs, 0, len));
			}
			randomAccessFile.seek(3);
			randomAccessFile.write("xy".getBytes());
			randomAccessFile.write(sBuffer.toString().getBytes());
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if (randomAccessFile != null) {
				try {
					randomAccessFile.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

	// 在文件的某个位置完成插入:
	/*
	 * 先把指针移动对应位置 读出指针后面的一行到一个字符串中 把指针移到插入位置 写入操作(此时指针在写入后的最后位置正好) 把字符串写入
	 * 
	 */
	@Test
	public void test3() {
		RandomAccessFile randomAccessFile = null;
		try {
			randomAccessFile = new RandomAccessFile(new File("HelloIO"), "rw");
			randomAccessFile.seek(3);
			String string = randomAccessFile.readLine();
			randomAccessFile.write("xy".getBytes());
			randomAccessFile.write(string.getBytes());
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if (randomAccessFile != null) {
				try {
					randomAccessFile.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

	// 在文件的某个位置进行覆盖的效果
	@Test
	public void test2() {
		RandomAccessFile randomAccessFile = null;
		try {
			randomAccessFile = new RandomAccessFile(new File("HelloIO"), "rw");
			randomAccessFile.seek(3);
			randomAccessFile.write("xy".getBytes());
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if (randomAccessFile != null) {
				try {
					randomAccessFile.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}

	}

	// 进行文件的读取和写入
	@Test
	public void test1() {
		// 进行文件的读取和写入
		RandomAccessFile r1 = null;
		RandomAccessFile r2 = null;
		try {
			// 读取的文件必须是存在的
			r1 = new RandomAccessFile(new File("hadi.txt"), "r");
			r2 = new RandomAccessFile(new File("file.txt"), "rw");
			byte[] bs = new byte[20];
			int len;
			while ((len = r1.read(bs)) != -1) {
				r2.write(bs, 0, len);
			}

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if (r2 != null) {
				try {
					r2.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			}
			if (r1 != null) {

				try {
					r1.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}

		}
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值