java RandomAccessFile随机读写流

xiaoxiao2021-02-28  125

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

转载请注明原文地址: https://www.6miu.com/read-69851.html

最新回复(0)