天天看點

JAVA随機存儲流(RandomAccessFile)的應用

   JAVA核心技術I 對RandomAccessFile有描述,是以才決定學習一下這個類的使用,不看不知道,原來這個類有點高大上..........;

     RandomAccessFile類的執行個體支援對随機通路檔案的讀取和寫入。随機通路檔案的行為類似存儲在檔案系統中的一個大型 byte 數組。存在指向該隐含數組的光标或索引,稱為檔案指針;輸入操作從檔案指針開始讀取位元組,并随着對位元組的讀取而前移此檔案指針。如果随機通路檔案以讀取/寫入模式建立,則輸出操作也可用;輸出操作從檔案指針開始寫入位元組,并随着對位元組的寫入而前移此檔案指針。寫入隐含數組的目前末尾之後的輸出操作導緻該數組擴充。

該檔案指針可以通過 getFilePointer 方法讀取,并通過 seek 方法設定。
           

RandomAccessFile實作了資料輸入輸出流的接口;可以随機存儲硬碟的檔案,但是來自網絡的檔案就不行

    RandomAccessFile的工作方式是,把DataInputStream和DataOutputStream結合起來,再加上它自己的一些方法,比如定位用的getFilePointer( ),在檔案裡移動用的seek( ),以及判斷檔案大小的length( )、skipBytes()跳過多少位元組數。此外,它的構造函數還要一個表示以隻讀方式("r"),還是以讀寫方式("rw")打開檔案

1, 第一個疑問;随機存儲流在讀寫檔案時如何定位

代碼如下;

package 随機存儲流;

import java.io.FileNotFoundException;
import java.io.RandomAccessFile;

/**
 * 随機存儲流的測試,随機存儲流不會删除前面的,會在後面添加
 * 
 * @author Administrator
 * 
 */
public class DemoRandomIO {

	public static void main(String[] args) {

		try {
			//執行個體化随機存儲流,不需要建立檔案的路徑
			RandomAccessFile Raf = new RandomAccessFile("file", "rw");
			//建立一個字元串數組并初始化
			String[] name = new String[3];
			name[0] = "JAVA";
			name[1] = "android";
			name[2] = "C++";
			//周遊數組
			for(int i = 0;i<name.length;i++){
				//使用随機流将數組寫出去
				Raf.writeUTF(name[i]);	
			}
			
			//添加元素
			Raf.seek(Raf.length());
			Raf.writeUTF("SSH");
			
			//使用seek将Raf.length()執行數組的第一個
			Raf.seek(0);
			
			//周遊使用偏移量來周遊,每移動一下就列印出資料
			while(Raf.getFilePointer()<Raf.length()){
				System.out.println(Raf.readUTF());
			}
					
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}

           

運作結果;

JAVA

android

C++

SSH

2,++++++++随機存儲流實作檔案的複制

package 随機存儲流;

import java.io.FileNotFoundException;
import java.io.RandomAccessFile;

/**
 * 随機存儲流的測試,
 * 
 * @author Administrator
 * 
 */
public class DemoRandomIO {

	public static void main(String[] args) {

		try {
			//執行個體化随機存儲流,不需要建立檔案的路徑
			RandomAccessFile Raf = new RandomAccessFile("file", "rw");
			//建立一個字元串數組并初始化
			String[] name = new String[3];
			name[0] = "JAVA";
			name[1] = "android";
			name[2] = "C++";
			//周遊數組
			for(int i = 0;i<name.length;i++){
				//使用随機流将數組寫出去
				Raf.writeUTF(name[i]);	
			}
			
			//添加元素
			Raf.seek(Raf.length());
			Raf.writeUTF("SSH");
			
			//使用seek将Raf.length()執行數組的第一個
			Raf.seek(0);
			
//			//周遊
//			while(Raf.getFilePointer()<Raf.length()){
//				System.out.println(Raf.readUTF());
//			}
			System.out.println(Raf.readUTF());
			System.out.println(Raf.readUTF());
			System.out.println(Raf.readUTF());
			
			//檔案複制
			System.out.println("開始複制.......");
			Raf.seek(0);//将檔案指向開始的地方
			//定義複制的檔案
			RandomAccessFile fileCopy = new RandomAccessFile("fileCopy", "rw");
			//擷取Raf檔案長度
			int len  = (int)Raf.length();
			//根據檔案的長度建立位元組數組
			byte[] by = new byte[len];
			//将Raf的檔案内容讀到數組中
			Raf.readFully(by);
			//将寫到InRaf檔案中
			fileCopy.write(by);
			System.out.println("複制完畢.....");
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}
           

 運作結果:

JAVA
 android
 C++
SSH
開始複制.......
複制完畢.....
           

怎麼知道filecopy檔案是否已經真的全部複制Raf檔案中的資料,周遊filecopy檔案中的資料

fileCopy.seek(0);
			System.out.println("複制的;"+fileCopy.readUTF());
			System.out.println("複制的;"+fileCopy.readUTF());
			System.out.println("複制的;"+fileCopy.readUTF());
			
           

 運作結果;

複制的;JAVA
複制的;android
複制的;C++
           

3,+++++實作多線程同時下載下傳,将檔案内容分割成幾小塊下載下傳,代碼如下

package 随機存儲流;
/**
 * 随機資料存儲流多線程下載下傳檔案的簡單實作,主視窗
 */
import java.io.File;
import java.io.FileNotFoundException;
import java.io.RandomAccessFile;

public class DemoTest {
	public static void main(String[] args) {
		
		try {
			// 執行個體化随機存儲流,建立檔案的路徑
			File file = new File("F:Raf.txt");
			RandomAccessFile Raf = new RandomAccessFile("file", "rw");
			//設定檔案的大小
			Raf.setLength(22*3);
			Raf.close();
			// 建立一個字元串數組并初始化
			String[] name = new String[3];
			name[0] = "JAVA";
			name[1] = "android";
			name[2] = "C++";
			
			//使用多線程來下載下傳
			for(int i = 0;i<name.length;i++){
				DemoTestThread th = new DemoTestThread(1024*i,name[i].getBytes());
				th.start();
			}
			System.out.println("下載下傳完畢...");

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}
           
package 随機存儲流;

import java.io.FileNotFoundException;
import java.io.RandomAccessFile;

/**
 * 建立線程
 * 
 * @author Administrator
 * 
 */
public class DemoTestThread extends Thread {
	// 建立線程需要檔案大小和檔案内容
	private int len;
	private byte[] con;
	private boolean islive = true;
    //建立構造方法
	public DemoTestThread(int len, byte[] con) {
		this.len = len;
		this.con = con;
	}

	@Override
	public void run() {
		while(islive){
		try {
			RandomAccessFile Raf = new RandomAccessFile("F:Raf.txt", "rw");
		     Raf.seek(len);
		     Raf.write(con);
		     Thread.sleep(50);
		} catch (Exception e) {
			islive =false;
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	}
}
           

 運作結果:

建立的檔案

JAVA随機存儲流(RandomAccessFile)的應用

 檔案中的内容

JAVA随機存儲流(RandomAccessFile)的應用