java RandomAccessFile随机读写流

Java的RandomAccessFile提供对文件的读写功能,与普通的输入输出流不一样的是RamdomAccessFile可以任意的访问文件的任何地方。这就是“Random”的意义所在。

RandomAccessFile的对象包含一个记录指针,用于标识当前流的读写位置,这个位置可以向前移动,也可以向后移动。RandomAccessFile包含两个方法来操作文件记录指针

特点:读写高效,支持任意位置读写操作


package demo2;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

/**
 * 使用RandomAccessFile实现文件复制 步骤: 
 * 1. 创建一个RandomAccessFile用于读取原文件
 * 2.创建一个RandomAccessFile用于写到目标文件 
 * 3. 循环一下操作: 
 * 3.1:从原文件兑取一个字节 
 * 3.2:将该字节写入到目标文件中 退出条件:
 * 当读取的值为-1时,到达文件末尾,结束
 * 4. 关闭流,释放资源
 *
 */
public class RandomAccessFile2 {

	public static void main(String[] args) {
		File file = new File("E:\\udp编程.wmv");
		// 下面设置每个线程读取长度
		long len = file.length();
		// 平均长度
		int avg = (int) (len / 4);
		MyThread t1 = new MyThread(0, avg - 1);
		MyThread t2 = new MyThread(avg, avg * 2 - 1);
		MyThread t3 = new MyThread(avg * 2, avg * 3 - 1);
		MyThread t4 = new MyThread(avg * 3, (int) (len - 1));
		t1.start();
		t2.start();
		t3.start();
		t4.start();

	}

}

class MyThread extends Thread {
	int start;
	int end;

	public MyThread(int start, int end) {
		super();
		this.start = start;
		this.end = end;
	}

	@Override
	public void run() {
		System.out.println(Thread.currentThread().getName() + "启动");
		RandomAccessFile source = null;
		RandomAccessFile target = null;
		try {
			// rw 为可读可写模式
			source = new RandomAccessFile("E:\\udp编程.wmv", "rw");
			target = new RandomAccessFile("E:\\udp3.wmv", "rw");
			// 开始读取的位置
			source.seek(start);
			// 开始写入的位置
			target.seek(start);
			// 需要读取的长度
			int length = end - start + 1;
			// 已读的长度
			int already = 0;
			byte[] bs = new byte[1024];
			int count = 0;
			while (true) {
				// 假如最后一段长度不够1024时,读取的长度是未读的实际长度
				if (length - already < 1024) {
					count = source.read(bs, 0, length - already);
					target.write(bs, 0, count);
					break;
				} else {
					count = source.read(bs);
					target.write(bs, 0, 1024);
					// 记录已经读取的长度
					already += count;
				}
			}
			System.out.println(Thread.currentThread().getName() + "复制完毕");
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if (source != null) {
				try {
					source.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if (target != null) {
				try {
					target.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值