Java RandomAccessFile 指定位置實(shí)現(xiàn)文件讀取與寫(xiě)入
Java RandomAccessFile 指定位置實(shí)現(xiàn)文件讀取與寫(xiě)入
RandomAccessFile是屬于隨機(jī)讀取類(lèi),是可以對(duì)文件本身的內(nèi)容直接隨機(jī)進(jìn)行操作的,可以在文件的指定位置的讀取和寫(xiě)入內(nèi)容,這在很多時(shí)候都是很方便的。
RandomAccessFile是用來(lái)訪問(wèn)那些保存數(shù)據(jù)記錄的文件的,你就可以用seek( )方法來(lái)訪問(wèn)記錄,并進(jìn)行讀寫(xiě)了。這些記錄的大小不必相同;但是其大小和位置必須是可知的。但是該類(lèi)僅限于操作文件。
RandomAccessFile不屬于InputStream和OutputStream類(lèi)系的。實(shí)際上,除了實(shí)現(xiàn)DataInput和 DataOutput接口之外(DataInputStream和DataOutputStream也實(shí)現(xiàn)了這兩個(gè)接口),它和這兩個(gè)類(lèi)系毫不相干,甚至不使用InputStream和OutputStream類(lèi)中已經(jīng)存在的任何功能;它是一個(gè)完全獨(dú)立的類(lèi),所有方法(絕大多數(shù)都只屬于它自己)都是從零開(kāi)始寫(xiě)的。這可能是因?yàn)镽andomAccessFile能在文件里面前后移動(dòng),所以它的行為與其它的I/O類(lèi)有些根本性的不同??偠灾?,它是一個(gè)直接繼承Object的,獨(dú)立的類(lèi)。
基本上,RandomAccessFile的工作方式是,把DataInputStream和DataOutputStream結(jié)合起來(lái),再加上它自己的一些方法,比如定位用的getFilePointer( ),在文件里移動(dòng)用的seek( ),以及判斷文件大小的length( )、skipBytes()跳過(guò)多少字節(jié)數(shù)。此外,它的構(gòu)造函數(shù)還要一個(gè)表示以只讀方式("r"),還是以讀寫(xiě)方式("rw")打開(kāi)文件的參數(shù) (和C的fopen( )一模一樣)。它不支持只寫(xiě)文件。
只有RandomAccessFile才有seek搜尋方法,而這個(gè)方法也只適用于文件。BufferedInputStream有一個(gè)mark( )方法,你可以用它來(lái)設(shè)定標(biāo)記(把結(jié)果保存在一個(gè)內(nèi)部變量里),然后再調(diào)用reset( )返回這個(gè)位置,但是它的功能太弱了,而且也不怎么實(shí)用。
實(shí)例代碼:
import java.io.IOException;
import java.io.RandomAccessFile;
/**
* RandomAccessFile是屬于隨機(jī)讀取類(lèi),是可以對(duì)文件本身的內(nèi)容直接隨機(jī)進(jìn)行操作的,就是說(shuō)可以指定位置
* 的讀取和寫(xiě)入內(nèi)容
* @author andy
*
*/
public class RandomAccessFileTest {
public static void main(String args[]) throws IOException {
write();
read();
}
public static void write() throws IOException {
//以讀寫(xiě)的方式來(lái)訪問(wèn)該文件
RandomAccessFile raf = new RandomAccessFile("D:\\test.txt", "rw");
raf.writeBytes("Hello World!");
raf.writeBoolean(true);
raf.writeInt(30);
raf.writeDouble(3.56);
raf.close();
}
public static void read() throws IOException {
RandomAccessFile raf = new RandomAccessFile("D:\\test.txt", "r");
raf.seek(12);//設(shè)置指針的位置
boolean booleanValue = raf.readBoolean();
int intValue = raf.readInt();
double doubleValue = raf.readDouble();
raf.seek(0);//設(shè)置指針的位置為文件的開(kāi)始部分
byte[] bytes = new byte[12];
for (int i=0; i<bytes.length; i++)
bytes[i] = raf.readByte();//每次讀一個(gè)字節(jié),并把它賦值給字節(jié)bytes[i]
String stringValue = new String(bytes);
raf.skipBytes(1);//指針跳過(guò)一個(gè)字節(jié)
int intValue2 = raf.readInt();
raf.close();
System.out.println(booleanValue);
System.out.println(intValue);
System.out.println(doubleValue);
System.out.println(stringValue);
System.out.println(intValue2);
}
}
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
SpringMVC執(zhí)行過(guò)程詳細(xì)講解
MVC是一種軟件設(shè)計(jì)典范,用一種業(yè)務(wù)邏輯、數(shù)據(jù)、界面顯示分離的方法組織代碼,將業(yè)務(wù)邏輯聚集到一個(gè)組件里面,在改進(jìn)和個(gè)性化定制界面及用戶交互的同時(shí),不需要重新編寫(xiě)業(yè)務(wù)邏輯,MVC分層有助于管理和架構(gòu)復(fù)雜的應(yīng)用程序2022-08-08
深入探究 spring-boot-starter-parent的作用
這篇文章主要介紹了spring-boot-starter-parent的作用詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,感興趣的小伙伴可以跟著小編一起來(lái)學(xué)習(xí)一下2023-05-05
Redisson RedLock紅鎖加鎖實(shí)現(xiàn)過(guò)程及原理
本文主要介紹了Redis中Redisson紅鎖(Redlock)使用原理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
java 網(wǎng)絡(luò)編程之TCP通信和簡(jiǎn)單的文件上傳功能實(shí)例
下面小編就為大家分享一篇java 網(wǎng)絡(luò)編程之TCP通信和簡(jiǎn)單的文件上傳功能實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
java HashMap內(nèi)部實(shí)現(xiàn)原理詳解
這篇文章主要介紹了java HashMap內(nèi)部實(shí)現(xiàn)原理詳解的相關(guān)資料,需要的朋友可以參考下2017-02-02
java swing實(shí)現(xiàn)簡(jiǎn)單的五子棋游戲
這篇文章主要為大家詳細(xì)介紹了java swing實(shí)現(xiàn)簡(jiǎn)單的五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03
解決idea 拉取代碼出現(xiàn)的 “ Сannot Run Git Cannot identify version of
這篇文章主要介紹了解決idea 拉取代碼出現(xiàn)的 “ Сannot Run Git Cannot identify version of git executable: no response“的問(wèn)題,需要的朋友可以參考下2020-08-08
Java使用FileInputStream流讀取文件示例詳解
這篇文章主要介紹了Java使用FileInputStream流讀取文件示例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07

