java-randomAccessFile

心之所向,素履以往,生如逆旅,一葦以航。

randomAccessFile介紹

  • RandomAccessFile父類是Object,沒有繼承字節流、字符流家族中任何一個類。並且它實現了DataInput、DataOutput這兩個接口,它既可以讀也可以寫。
  • 以前接觸的輸入流和輸出流都是從頭部進行讀文件或者寫文件,不能從中間開始,如果是開多線程下載一個文件我們之前學過的FileWriter或者FileReader等等都無法完成,而當前介紹的RandomAccessFile他就可以解決這個問題,因爲它可以指定位置讀,指定位置寫,通常開發過程中,多用於多線程下載一個大文件。

常用方法

構造方法
RandomAccessFile(File file, String mode) 
          創建從中讀取和向其中寫入(可選)的隨機訪問文件流,該文件由 File 參數指定。 
RandomAccessFile(String name, String mode) 
          創建從中讀取和向其中寫入(可選)的隨機訪問文件流,該文件具有指定名稱。 
          
	mode 參數指定用以打開文件的訪問模式。允許的值及其含意爲: 
     "r" 以只讀方式打開。調用結果對象的任何 write 方法都將導致拋出 IOException。  
     "rw" 打開以便讀取和寫入。如果該文件尚不存在,則嘗試創建該文件。  
	"rws" 打開以便讀取和寫入,對於 "rw",還要求對文件的內容或元數據的每個更新都同步寫入到底層存儲設備。  
	"rwd" 打開以便讀取和寫入,對於 "rw",還要求對文件內容的每個更新都同步寫入到底層存儲設備。  
          
普通方法概述
 long length() 
          返回此文件的長度。 
void seek(long pos) 
       設置讀寫的位置,pos指針偏移量
void setLength(long newLength) 
          設置此文件的長度。 newLength爲0相當於清空文件
long getFilePointer() 
          返回此文件中的當前偏移量。 

   read和write方法 和字節流,字符流的一致
   
  int read() 
          從此文件中讀取一個數據字節。 
 int read(byte[] b) 
          將最多 b.length 個數據字節從此文件讀入 byte 數組。 
 int read(byte[] b, int off, int len) 
          將最多 len 個數據字節從此文件讀入 byte 數組。 
 int read() 
          從此文件中讀取一個數據字節。 
 int read(byte[] b) 
          將最多 b.length 個數據字節從此文件讀入 byte 數組。 
 int read(byte[] b, int off, int len) 
          將最多 len 個數據字節從此文件讀入 byte 數組。 
 boolean readBoolean() 
          從此文件讀取一個 boolean。 
 byte readByte() 
          從此文件讀取一個有符號的八位值。 
 char readChar() 
          從此文件讀取一個字符。 
 double readDouble() 
          從此文件讀取一個 double。 
 float readFloat() 
          從此文件讀取一個 float。 
 void readFully(byte[] b) 
          將 b.length 個字節從此文件讀入 byte 數組,並從當前文件指針開始。 
 void readFully(byte[] b, int off, int len) 
          將正好 len 個字節從此文件讀入 byte 數組,並從當前文件指針開始。 
 int readInt() 
          從此文件讀取一個有符號的 32 位整數。 
 String readLine() 
          從此文件讀取文本的下一行。 
 long readLong() 
          從此文件讀取一個有符號的 64 位整數。 
 short readShort() 
          從此文件讀取一個有符號的 16 位數。 
 int readUnsignedByte() 
          從此文件讀取一個無符號的八位數。 
 int readUnsignedShort() 
          從此文件讀取一個無符號的 16 位數。 
 String readUTF() 
          從此文件讀取一個字符串。 
 void seek(long pos) 
          設置到此文件開頭測量到的文件指針偏移量,在該位置發生下一個讀取或寫入操作。 
 void setLength(long newLength) 
          設置此文件的長度。 
 int skipBytes(int n) 
          嘗試跳過輸入的 n 個字節以丟棄跳過的字節。 
 void write(byte[] b) 
          將 b.length 個字節從指定 byte 數組寫入到此文件,並從當前文件指針開始。 
 void write(byte[] b, int off, int len) 
          將 len 個字節從指定 byte 數組寫入到此文件,並從偏移量 off 處開始。 
 void write(int b) 
          向此文件寫入指定的字節。 
 void writeBoolean(boolean v) 
          按單字節值將 boolean 寫入該文件。 
 void writeByte(int v) 
          按單字節值將 byte 寫入該文件。 
 void writeBytes(String s) 
          按字節序列將該字符串寫入該文件。 
 void writeChar(int v) 
          按雙字節值將 char 寫入該文件,先寫高字節。 
 void writeChars(String s) 
          按字符序列將一個字符串寫入該文件。 
 void writeDouble(double v) 
          使用 Double 類中的 doubleToLongBits 方法將雙精度參數轉換爲一個 long,然後按八字節數量將該 long 值寫入該文件,先定高字節。 
 void writeFloat(float v) 
          使用 Float 類中的 floatToIntBits 方法將浮點參數轉換爲一個 int,然後按四字節數量將該 int 值寫入該文件,先寫高字節。 
 void writeInt(int v) 
          按四個字節將 int 寫入該文件,先寫高字節。 
 void writeLong(long v) 
          按八個字節將 long 寫入該文件,先寫高字節。 
 void writeShort(int v) 
          按兩個字節將 short 寫入該文件,先寫高字節。 
 void writeUTF(String str) 
          使用 modified UTF-8 編碼以與機器無關的方式將一個字符串寫入該文件。 

案例
講一個文件中的內容分塊讀出,並寫入到另一個文件中

package RandomAccessFileDemo;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;

import org.omg.CORBA.PRIVATE_MEMBER;

public class randomAccessFileDemo {
    private static String readFilePath = "C:/Users/asus-pc/Desktop/1.mp4";
    private static String writeFilePath = "C:/Users/asus-pc/Desktop/javaProject/Demo/src/RandomAccessFileDemo/1.mp4";
    static int loadNum = 0;
	static int bufferSize = 10240;
	static long   totalSize = 0;
	public static void main(String[] args) {
	   
		//jdk7之後 放在try後面的(),可以自動關閉流的資源。
	try(
			//讀文件
			 RandomAccessFile	rFile    =new RandomAccessFile(readFilePath, "r");
			//寫文件
			RandomAccessFile wFile  = new RandomAccessFile(writeFilePath, "rw");
			
			) {
	
		
		totalSize = rFile.length();
		
		while(totalSize>loadNum){
			byte bytes[]=new byte[bufferSize];
			//讀取10240個字節到內存中,read讀完之後,自動更改了當前指針位置
			int readSize = rFile.read(bytes);
			System.out.println("當前指針位置"+rFile.getFilePointer());
			if(readSize==0)
				break;
			else{
				loadNum+=readSize;
				wFile.write(bytes);
				System.out.println("當前進度:"+(loadNum*1.0/totalSize*100)+"%");
			}
			
		}
	
	} catch (FileNotFoundException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}
	
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章