java RandomAccessFile隨機讀寫流
阿新 • • 發佈:2019-01-09
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(); } } } } }