------------siwuxie095
工程名:TestRandomAccessFile
包名:com.siwuxie095.file
類名:MultiWriteFile.java(主類)、WriteFile.java
工程結構目錄如下:
WriteFile.java:
package com.siwuxie095.file;
import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile;
//WriteFile 繼承自 Thread,作為一個線程 //RandomAccessFile: //在寫入時,可以為每一個線程指定一個固定的寫入區域, //這可以用於多線程的下載,以及多線程的文件傳輸 //在讀取時,也可以指定RandomAccessFile來讀取文件中的特定內容 public class WriteFile extends Thread {
//聲明三個本地變量 File file; int block; int L=100;
/** * 如:將一個文件均勻划分成 5 個區域,每一個區域都是一個塊 block, * 每個block的長度設為100字節 * 構造方法中傳入的block數值是幾,就從哪個塊開始讀寫 * * 1 2 3 4 5 * |---------|---------|---------|---------|---------| * 0xL 1xL 2xL * * @param f * @param b */
//先為線程創建一個構造方法,傳入兩個參數 //一個是要寫的文件,另一個是當前線程所負責的寫入文件的區塊 public WriteFile(File f,int b) { this.file=f; this.block=b; }
//在當前類中覆蓋 Thread 的 run() 方法,並重寫 @Override public void run() {
try {
//創建一個 RandomAccessFile 隨機讀寫文件,並指定操作的文件對象和操作模式 //操作模式有4種:(一般情況下都使用 rw) //(1)r 只讀 //(2)rw 可讀可寫 //(3)rws 可讀可寫,還要求對"文件的內容"或"元數據"的每個更新都同步寫入到基礎存儲設備 //(4)rwd 可讀可寫,還要求對"文件的內容"的每個更新都同步寫入到基礎存儲設備 //有異常拋出,需要用 try catch 捕獲 RandomAccessFile raf=new RandomAccessFile(file, "rw");
//通過隨機讀寫文件,可以讀取到或寫入到當前文件的任何一個位置 /*如:一個文件對象,有頭和尾,中間是文件內容 * * 如果想從(1)處寫入文件數據,可以將 RandomAccessFile 的指針移動到(1)處, * 直接開始寫入,以后的數據依次從(1)處向后寫入 * * 如果想從(2)處寫入3個加號,同理,3個加號就出現在(2)處 * * 如果想從某個位置讀取數據,同樣要移動文件的指針到該位置, * 然后開始讀取相應數量的數據 * * (1) (2) * |*** |+++ * |------***-----------+++--------------------| * 文件頭 文件尾 */
//調用 RandomAccessFile 的 seek()方法設定文件的指針 //通過文件自身的指針,設定讀取或寫入的偏移量, //然后指針自動向后偏移。 //對於每一個文件,根據傳入的block值來確定讀寫的位置 //block是從1開始的,但文件的指針是從0開始的 //使用(block-1)*L //這樣就將文件的指針指定到當前線程所負責的區域的頭部 raf.seek((block-1)*L);
//調用 writeBytes() 方法寫入文件:傳入字符串,會自動 //將字符串轉換成字節寫入到文件當中 //這里的 block 雖然是整型,但會自動轉換為String raf.writeBytes("This is block "+block);
//再輸出20個短橫 for (int i = 0; i < 20; i++) { raf.writeBytes("-"); }
//關閉RandomAccessFile raf.close();
} catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } |
MultiWriteFile.java:
package com.siwuxie095.file;
import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile;
public class MultiWriteFile {
//先在主類中創建一個靜態文件對象,使用相對路徑 static File file=new File("test.txt");
public static void main(String[] args) { //判斷文件是否存在 if (file.exists()) { //如果存在就先將文件刪除掉,保證每次寫入,當前文件都是一個新文件 //不會被之前的文件版本所影響 //這里不必擔心當前的線程無法向該文件寫入數據 //因為在 RandomAccessFile 寫入文件時,文件不存在,它會自動把文件創建出來 file.delete(); }
//寫入文件: //創建WriteFile,指定不同線程寫入不同的區塊,並開啟線程 //寫入文件的順序與線程的先后創建順序無關,嚴格按照指定的區塊去寫 new WriteFile(file,5).start(); new WriteFile(file,3).start(); new WriteFile(file,1).start(); new WriteFile(file,4).start(); new WriteFile(file,2).start();
try {
//讀取文件: RandomAccessFile raf=new RandomAccessFile(file, "r"); //這里要讀取第5個區塊,即指針從400開始 raf.seek(400); //調用 read()方法時要傳入一個字節型的數組,並指定讀取的長度 byte input[]=new byte[20]; raf.read(input); //創建String,傳入字節型數組input String inputString=new String(input); System.out.println(inputString); raf.close();
} catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
} |
運行一覽:
讀取第 5 個區塊的 20 個字節:
test.txt 的內容:
test.txt 共 435 字節:4x100+35
(最后35個字節即 This is block 5--------------------)
運行后,工程結構目錄一覽:
【made by siwuxie095】