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();
}
}
}
}
}