1. 程式人生 > >java RandomAccessFile隨機讀寫流

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