java使用RandomAccessFile類基於指針讀寫文件
讀寫模式
使用該類時可以指定對要操作文件的讀寫模式
/**
* r:以只讀方式打開指定文件。如果試圖對該RandomAccessFile指定的文件執行寫入方法則會拋出IOException
* rw:以讀取、寫入方式打開指定文件。如果該文件不存在,則嘗試創建文件
* rws:以讀取、寫入方式打開指定文件。相對於rw模式,還要求對文件的內容或元數據的每個更新都同步寫入到底層存儲設備,
* 默認情形下(rw模式下),是使用buffer的,
* 只有cache滿的或者使用RandomAccessFile.close()關閉流的時候兒才真正的寫到文件
* rwd:與rws類似,只是僅對文件的內容同步更新到磁盤,而不修改文件的元數據
*/
RandomAccessFile file = new RandomAccessFile("C:\\123.txt", "r");
RandomAccessFile file2 = new RandomAccessFile(new File(""), "rw");
RandomAccessFile file3 = new RandomAccessFile(new File(""), "rws");
RandomAccessFile file4 = new RandomAccessFile(new File(""), "rwd");
文件讀寫操作
寫文件
public static void main(String[] args) throws IOException {
RandomAccessFile file = new RandomAccessFile("C:\\Users\\Lenovo\\Desktop\\123.txt", "rw");
//寫出一個字節,寫出的是int值的低8位,其它位捨棄
file.write(97);//0110 0001
file.close();
}
運行結果
讀文件
public static void main(String[] args) throws IOException {
RandomAccessFile file = new RandomAccessFile("C:\\Users\\Lenovo\\Desktop\\123.txt", "rw");
int read = file.read();//每次讀一個字節,填充到int的低八位
file.close();
System.out.println(read);
}
運行結果
RandomAccessFile類中還封裝了對8中基本數據類型的讀寫操作,使用起來會很方便。分別爲:readByte()、readShort()、readInt()、readLong()、readFloat()、readDouble()、readBoolean()、readChar(),返回值類型均爲對應的基本數據類型。同時相應的也有這八種writeByte()…方法。這是在流式讀寫文件中所不具有的。
示例:
public class Demo {
public static void main(String[] args) throws IOException {
int a = 97;
File file = new File("C:\\Users\\Lenovo\\Desktop\\123.txt");
RandomAccessFile res = new RandomAccessFile(file, "rw");
//雖然能寫入,但是在記事本中打開仍亂碼字符(由於寫入的是二進制文件)
res.write(a >>> 24);//11111111
res.write(a >>> 16);
res.write('我');
res.write(a);
//獲取當前指針位置
long pos = res.getFilePointer();
//!!注意,返回值是字節4,前面寫入的四個字節對應從0--3字節
System.out.println("pos:" + pos);//4
//將int值分成四部分寫入
res.writeInt(255);
System.out.println("pos:" + res.getFilePointer());//8
//將long值分成八個字節寫入
res.writeLong(255);
System.out.println("pos:" + res.getFilePointer());//16
//將float值分成四個字節寫入
res.writeFloat(8);
System.out.println("pos:" + res.getFilePointer());//20
//將double值分成八個字節寫入
res.writeDouble(12.1);
System.out.println("pos:" + res.getFilePointer());//28
//由byte數組的大小決定指針向後移動多少位
res.write(new byte[]{1, 1});
System.out.println("pos:" + res.getFilePointer());//30
res.writeBoolean(false);
System.out.println("pos:" + res.getFilePointer());//31
res.writeChar(1);
//此時指針指向文件最後一個位
System.out.println(res.read());//-1
/*
*void seek(long pos)
*將指針移動到指定位置
* */
res.seek(0);
System.out.println("point:" + res.getFilePointer());//0
//讀取剛剛寫入的long值
res.seek(8);
long l = res.readLong();
System.out.println("讀出的long值:" + l);//255
//讀取剛剛寫入的double值
res.seek(20);
System.out.println("讀出的double值:" + res.readDouble());//12.1
res.close();
}
運行結果
示例:將文件A的內容複製到文件B
RandomAccessFile res = new RandomAccessFile("C:\\Users\\Lenovo\\Desktop\\123.txt", "r");
File file = new File("C:\\Users\\Lenovo\\Desktop\\456.txt");
if (!file.exists()) {
file.createNewFile();
}
RandomAccessFile dest = new RandomAccessFile(file, "rw");
System.out.println(res.length());
while (res.getFilePointer() < res.length()) {
dest.write(res.read());
}
res.close();
dest.close();
文件指針操作
long getFilePointer():該方法用於返回當前指針位置
ps:
- RandomAccessFile是基於指針讀寫,總是在指針當前位置讀寫
- 進行了讀或寫一個字節後,指針都會自動向後移動到下一個字節的位置
- 默認創建出來RandomAccessFile時,指針位置爲0,即:文件的第一個字節的位置
File file = new File("C:\\Users\\Lenovo\\Desktop\\123.txt");
RandomAccessFile res = new RandomAccessFile(file, "rw");
System.out.println(res.getFilePointer());//獲取指針位置
res.read();
System.out.println(res.getFilePointer());//獲取指針位置
res.close();
運行結果
void seek(long pos):該方法可以設定指針位置
File file = new File("C:\\Users\\Lenovo\\Desktop\\123.txt");
RandomAccessFile res = new RandomAccessFile(file, "rw");
System.out.println(res.getFilePointer());//初始指針位置
res.seek(4);//指定位置
System.out.println(res.getFilePointer());
res.seek(2);//指定位置
System.out.println(res.getFilePointer());
res.close();
運行結果
int skipBytes(int n):該方法可以跳過n個字節
File file = new File("C:\\Users\\Lenovo\\Desktop\\123.txt");
RandomAccessFile res = new RandomAccessFile(file, "rw");
System.out.println(res.getFilePointer());//初始指針位置
res.seek(4);//指定位置
System.out.println(res.getFilePointer());
res.seek(2);//指定位置
System.out.println(res.getFilePointer());
int i = res.skipBytes(3);//調過3個字節
System.out.println("跳過" + i + "個字節");
System.out.println(res.getFilePointer());
res.close();
運行結果
這就是RandomAccessFile類的基本用法,就先介紹到這,有機會在深入介紹