使用RandomAccessFile讀寫數據


------------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】


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM