日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java_io体系之RandomAccessFile简介、走进源码及示例——20

發(fā)布時(shí)間:2025/7/14 java 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java_io体系之RandomAccessFile简介、走进源码及示例——20 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Java_io體系之RandomAccessFile簡(jiǎn)介、走進(jìn)源碼及示例——20

?

RandomAccessFile

1、?????? 類功能簡(jiǎn)介:

?

?????? 文件隨機(jī)訪問(wèn)流、關(guān)心幾個(gè)特點(diǎn):

?

1、他實(shí)現(xiàn)的接口不再是InputStream、OutputStream中的任何一個(gè)、而是實(shí)現(xiàn)的DataInput、DataOutput。這也注定了他可以對(duì)java基礎(chǔ)類型進(jìn)行操作、而且是即可讀取、也可以寫入、關(guān)于這部分的方法大多數(shù)都是從DataInputStream、DataOutputStream那里蕩來(lái)的。

?

2、如其名、隨機(jī)流、這里的隨機(jī)并不是不可控制、不可預(yù)測(cè)的去訪問(wèn)文件、而是可以通過(guò)指針的形式定位到具體的位置——“文件指針”、具體使用“文件指針”的方法:調(diào)用此流的seek(long n)方法來(lái)設(shè)置位置、使用此方法要注意的是如果傳入的n大于文件長(zhǎng)度、此方法不會(huì)改變文件長(zhǎng)度、只是當(dāng)寫入下一個(gè)字節(jié)時(shí)會(huì)改變文件大小、即下一個(gè)寫入的字節(jié)是添加在n后的。如果n小于文件長(zhǎng)度、則會(huì)從n位置開始覆蓋后面的file內(nèi)容、

?

3、此流既可以讀取文件、也可以寫入文件、也可具有只讀功能、但是沒有只寫功能、具體是哪種類型是在構(gòu)造方法中指定的——String mode;具體的區(qū)別上面有說(shuō)明。。

?

???????????????? 這里把實(shí)例放在了前面、因?yàn)樵创a和方法所占篇幅太長(zhǎng)、有興趣的可繼續(xù)往下看。

?

2、?????? 實(shí)例演示:

?

?

package com.chy.io.original.test;import java.io.File; import java.io.IOException; import java.io.RandomAccessFile;public class RandomAccessFileTests {private static final File file = new File("D:\\rsf.txt");/*** 向文件中寫入內(nèi)容*/public static void testRandomAccessFileWriter() throws IOException{//要先將已有文件刪除、避免干擾。if(file.exists()){file.delete();}RandomAccessFile rsfWriter = new RandomAccessFile(file, "rw");//不會(huì)改變文件大小、但是他會(huì)將下一個(gè)字符的寫入位置標(biāo)識(shí)為10000、也就是說(shuō)此后只要寫入內(nèi)容、就是從10001開始存、rsfWriter.seek(10000);printFileLength(rsfWriter); //result: 0//會(huì)改變文件大小、只是把文件的size改變、并沒有改變下一個(gè)要寫入的內(nèi)容的位置、這里注釋掉是為了驗(yàn)證上面的seek方法的說(shuō)明內(nèi)容//rsfWriter.setLength(10000);printFileLength(rsfWriter); //result: 0//每個(gè)漢子占3個(gè)字節(jié)、寫入字符串的時(shí)候會(huì)有一個(gè)記錄寫入字符串長(zhǎng)度的兩個(gè)字節(jié)rsfWriter.writeUTF("陳華應(yīng)"); printFileLength(rsfWriter); //result: 10011//每個(gè)字符占兩個(gè)字節(jié)rsfWriter.writeChar('a');rsfWriter.writeChars("abcde");printFileLength(rsfWriter); //result: 10023//再?gòu)摹拔募羔槨睘?000的地方插一個(gè)長(zhǎng)度為100、內(nèi)容全是'a'的字符數(shù)組//這里file長(zhǎng)依然是10023、因?yàn)樗菑摹拔募羔槨睘?000的地方覆蓋后面的200個(gè)字節(jié)、下標(biāo)并沒有超過(guò)文件長(zhǎng)度rsfWriter.seek(5000);char[] cbuf = new char[100];for(int i=0; i

?

3、 RandomAccessFile API簡(jiǎn)介:

A:構(gòu)造方法

RandomAccessFile(File file, String mode) 創(chuàng)建從中讀取和向其中寫入(可選)的隨機(jī)訪問(wèn)文件流,該文件由 File 參數(shù)指定。 RandomAccessFile(String name, String mode) 從中讀取和向其中寫入(可選)的隨機(jī)訪問(wèn)文件流,該文件具有指定名稱。 補(bǔ)充一:mode的取值有下面四種情況
"r" 以只讀方式打開。調(diào)用結(jié)果對(duì)象的任何 write 方法都將導(dǎo)致拋出 IOException。
"rw" 打開以便讀取和寫入。
"rws" 打開以便讀取和寫入。相對(duì)于 "rw","rws" 還要求對(duì)“文件的內(nèi)容”或“元數(shù)據(jù)”的每個(gè)更新都同步寫入到基礎(chǔ)存儲(chǔ)設(shè)備。
"rwd" 打開以便讀取和寫入,相對(duì)于 "rw","rwd" 還要求對(duì)“文件的內(nèi)容”的每個(gè)更新都同步寫入到基礎(chǔ)存儲(chǔ)設(shè)備。
補(bǔ)充二:關(guān)于文件的“元數(shù)據(jù)”
The definition of metadata is "data about other data." With a file system, the data is contained in its files and directories, and the metadata tracks information about each of these objects: Is it a regular file, a directory,or a link? What is its size, creation date, last modified date, file owner, group owner, and access permissions?
補(bǔ)充三:"rw" "rws" "rwd"之間的區(qū)別
當(dāng)操作的文件是存儲(chǔ)在本地的基礎(chǔ)存儲(chǔ)設(shè)備上時(shí)(如硬盤, NandFlash等),"rws" 或 "rwd", "rw" 才有區(qū)別。
當(dāng)模式是 "rws" 并且 操作的是基礎(chǔ)存儲(chǔ)設(shè)備上的文件;那么,每次“更改文件內(nèi)容[如write()寫入數(shù)據(jù)]” 或 “修改文件元數(shù)據(jù)(如文件的mtime)”時(shí),都會(huì)將這些改變同步到基礎(chǔ)存儲(chǔ)設(shè)備上。
當(dāng)模式是 "rwd" 并且 操作的是基礎(chǔ)存儲(chǔ)設(shè)備上的文件;那么,每次“更改文件內(nèi)容[如write()寫入數(shù)據(jù)]”時(shí),都會(huì)將這些改變同步到基礎(chǔ)存儲(chǔ)設(shè)備上。
當(dāng)模式是 "rw" 并且 操作的是基礎(chǔ)存儲(chǔ)設(shè)備上的文件;那么,關(guān)閉文件時(shí),會(huì)將“文件內(nèi)容的修改”同步到基礎(chǔ)存儲(chǔ)設(shè)備上。至于,“更改文件內(nèi)容”時(shí),是否會(huì)立即同步,取決于系統(tǒng)底層實(shí)現(xiàn)。
一般使用前兩個(gè)就ok。

B:一般方法

void close() 關(guān)閉此隨機(jī)訪問(wèn)文件流并釋放與該流關(guān)聯(lián)的所有系統(tǒng)資源。 FileChannel getChannel() 返回與此文件關(guān)聯(lián)的唯一 FileChannel 對(duì)象。 FileDescriptor getFD() 返回與此流關(guān)聯(lián)的不透明文件描述符對(duì)象。 long getFilePointer() 返回此文件中的當(dāng)前偏移量。 long length() 返回此文件的長(zhǎng)度。 int read() 從此文件中讀取一個(gè)數(shù)據(jù)字節(jié)。 int read(byte[] b) 將最多 b.length 個(gè)數(shù)據(jù)字節(jié)從此文件讀入 byte 數(shù)組。 int read(byte[] b, int off, int len) 將最多 len 個(gè)數(shù)據(jù)字節(jié)從此文件讀入 byte 數(shù)組。 boolean readBoolean() 從此文件讀取一個(gè) boolean。 byte readByte() 從此文件讀取一個(gè)有符號(hào)的八位值。 char readChar() 從此文件讀取一個(gè)字符。 double readDouble() 從此文件讀取一個(gè) double。 float readFloat() 從此文件讀取一個(gè) float。 void readFully(byte[] b) 將 b.length 個(gè)字節(jié)從此文件讀入 byte 數(shù)組,并從當(dāng)前文件指針開始。 void readFully(byte[] b, int off, int len) 將正好 len 個(gè)字節(jié)從此文件讀入 byte 數(shù)組,并從當(dāng)前文件指針開始。 int readInt() 從此文件讀取一個(gè)有符號(hào)的 32 位整數(shù)。 String readLine() 從此文件讀取文本的下一行。 long readLong() 從此文件讀取一個(gè)有符號(hào)的 64 位整數(shù)。 short readShort() 從此文件讀取一個(gè)有符號(hào)的 16 位數(shù)。 int readUnsignedByte() 從此文件讀取一個(gè)無(wú)符號(hào)的八位數(shù)。 int readUnsignedShort() 從此文件讀取一個(gè)無(wú)符號(hào)的 16 位數(shù)。 String readUTF() 從此文件讀取一個(gè)字符串。 void seek(long pos) 設(shè)置到此文件開頭測(cè)量到的文件指針偏移量,在該位置發(fā)生下一個(gè)讀取或?qū)懭氩僮鳌?void setLength(long newLength) 設(shè)置此文件的長(zhǎng)度。 int skipBytes(int n) 嘗試跳過(guò)輸入的 n 個(gè)字節(jié)以丟棄跳過(guò)的字節(jié)。 void write(byte[] b) 將 b.length 個(gè)字節(jié)從指定 byte 數(shù)組寫入到此文件,并從當(dāng)前文件指針開始。 void write(byte[] b, int off, int len) 將 len 個(gè)字節(jié)從指定 byte 數(shù)組寫入到此文件,并從偏移量 off 處開始。 void write(int b) 向此文件寫入指定的字節(jié)。 void writeBoolean(boolean v) 按單字節(jié)值將 boolean 寫入該文件。 void writeByte(int v) 按單字節(jié)值將 byte 寫入該文件。 void writeBytes(String s) 按字節(jié)序列將該字符串寫入該文件。 void writeChar(int v) 按雙字節(jié)值將 char 寫入該文件,先寫高字節(jié)。 void writeChars(String s) 按字符序列將一個(gè)字符串寫入該文件。 void writeDouble(double v) 使用 Double 類中的 doubleToLongBits 方法將雙精度參數(shù)轉(zhuǎn)換為一個(gè) long,然后按八字節(jié)數(shù)量將該 long 值寫入該文件,先定高字節(jié)。 void writeFloat(float v) 使用 Float 類中的 floatToIntBits 方法將浮點(diǎn)參數(shù)轉(zhuǎn)換為一個(gè) int,然后按四字節(jié)數(shù)量將該 int 值寫入該文件,先寫高字節(jié)。 void writeInt(int v) 按四個(gè)字節(jié)將 int 寫入該文件,先寫高字節(jié)。 void writeLong(long v) 按八個(gè)字節(jié)將 long 寫入該文件,先寫高字節(jié)。 void writeShort(int v) 按兩個(gè)字節(jié)將 short 寫入該文件,先寫高字節(jié)。 void writeUTF(String str) 使用 modified UTF-8 編碼以與機(jī)器無(wú)關(guān)的方式將一個(gè)字符串寫入該文件。

4、 源碼分析

?

package com.chy.io.original.code;import java.io.Closeable; import java.io.EOFException; import java.io.File; import java.io.FileDescriptor; import java.io.FileNotFoundException; import java.io.IOException; import java.io.UTFDataFormatException; import java.nio.channels.FileChannel;import sun.nio.ch.FileChannelImpl;/*** 隨機(jī)訪問(wèn)文件流、既可以對(duì)文件進(jìn)行讀取、也可以對(duì)文件進(jìn)行寫入、還可以寫入java基礎(chǔ)類型、不再是InputStream或者OutputStream的子類、* 而是實(shí)現(xiàn)了DataOutput、DataInput、通過(guò)這兩個(gè)接口也可以看出、此類具有將java基礎(chǔ)類型寫入文件或者讀取到程序中的功能、關(guān)于寫入/讀取文件基礎(chǔ)類型* 的操作大多數(shù)都是剽竊DataInputStream/DataOutputStream的。*/public class RandomAccessFile implements DataOutput, DataInput, Closeable {java.io.RandomAccessFileprivate FileDescriptor fd;private FileChannel channel = null;private boolean rw;//標(biāo)識(shí)此文件是否既可以讀又可以寫//標(biāo)識(shí)不同mode對(duì)應(yīng)的值private static final int O_RDONLY = 1;private static final int O_RDWR = 2;private static final int O_SYNC = 4;private static final int O_DSYNC = 8;/*** 使用指定的文件、模式構(gòu)造RandomAccessFile、初始化參數(shù)、打開到文件的連接*/public RandomAccessFile(String name, String mode)throws FileNotFoundException{this(name != null ? new File(name) : null, mode);}/*** 使用指定的文件、模式構(gòu)造RandomAccessFile、初始化參數(shù)、打開到文件的連接*/public RandomAccessFile(File file, String mode)throws FileNotFoundException{String name = (file != null ? file.getPath() : null);int imode = -1;if (mode.equals("r"))imode = O_RDONLY;else if (mode.startsWith("rw")) {imode = O_RDWR;rw = true;if (mode.length() > 2) {if (mode.equals("rws"))imode |= O_SYNC;else if (mode.equals("rwd"))imode |= O_DSYNC;elseimode = -1;}}if (imode len) {newpos = len;}seek(newpos);/* return the actual number of bytes skipped */return (int) (newpos - pos);}// 'Write' primitives/*** 在當(dāng)前“文件指針”標(biāo)示的地方寫入一個(gè)字節(jié)*/public native void write(int b) throws IOException;/*** 將b的一部分寫入到文件中*/private native void writeBytes(byte b[], int off, int len) throws IOException;/*** 將b寫入到文件中*/public void write(byte b[]) throws IOException {writeBytes(b, 0, b.length); }/*** 將b的一部分寫入到文件中*/public void write(byte b[], int off, int len) throws IOException {writeBytes(b, off, len);}// 'Random access' stuff/*** 返回當(dāng)前文件的偏移量、即“文件描述符”的位置*/public native long getFilePointer() throws IOException;/*** 設(shè)置“文件指針”的偏移量、從文件的開頭開始計(jì)數(shù)、如果pos大于文件的長(zhǎng)度、也不會(huì)改變文件的大小、* 文件的大小只有在當(dāng)“文件指針”指向文件最后的時(shí)候、再向文件中寫入字節(jié)才會(huì)擴(kuò)展。*/public native void seek(long pos) throws IOException;/*** 返回文件的字節(jié)數(shù)*/public native long length() throws IOException;/*** 設(shè)置文件長(zhǎng)度:* if(newLength > originalLength)* 擴(kuò)展文件長(zhǎng)度、新增加的長(zhǎng)度使用默認(rèn)值填充;* else* 截取源文件的前originalLength字節(jié)、如果源文件的偏移量大于newLength、則將源文件的偏移量設(shè)為newLength;*/public native void setLength(long newLength) throws IOException;/*** 關(guān)閉此流、釋放與此流有關(guān)的所有資源*/public void close() throws IOException {if (channel != null)channel.close();close0();}// 一些方法是從DataInputStream/DataOutputStream中剽竊來(lái)的。。。/*** 讀取一個(gè)boolean型數(shù)據(jù)*/public final boolean readBoolean() throws IOException {int ch = this.read();if (ch >> 8) & 0xFF);write((v >>> 0) & 0xFF);//written += 2;}/*** 將一個(gè)char寫入文件*/public final void writeChar(int v) throws IOException {write((v >>> 8) & 0xFF);write((v >>> 0) & 0xFF);//written += 2;}/*** 將一個(gè)int寫入文件*/public final void writeInt(int v) throws IOException {write((v >>> 24) & 0xFF);write((v >>> 16) & 0xFF);write((v >>> 8) & 0xFF);write((v >>> 0) & 0xFF);//written += 4;}/*** 將一個(gè)long寫入文件*/public final void writeLong(long v) throws IOException {write((int)(v >>> 56) & 0xFF);write((int)(v >>> 48) & 0xFF);write((int)(v >>> 40) & 0xFF);write((int)(v >>> 32) & 0xFF);write((int)(v >>> 24) & 0xFF);write((int)(v >>> 16) & 0xFF);write((int)(v >>> 8) & 0xFF);write((int)(v >>> 0) & 0xFF);//written += 8;}/*** 將一個(gè)long寫入文件*/public final void writeFloat(float v) throws IOException {writeInt(Float.floatToIntBits(v));}/*** 將一個(gè)double寫入文件。*/public final void writeDouble(double v) throws IOException {writeLong(Double.doubleToLongBits(v));}/*** 將一個(gè)字符串轉(zhuǎn)換成一串有序字節(jié)寫入*/public final void writeBytes(String s) throws IOException {int len = s.length();byte[] b = new byte[len];s.getBytes(0, len, b, 0);writeBytes(b, 0, len);}/*** 將一個(gè)字符串以一串有序字符寫入文件中*/public final void writeChars(String s) throws IOException {int clen = s.length();int blen = 2*clen;byte[] b = new byte[blen];char[] c = new char[clen];s.getChars(0, clen, c, 0);for (int i = 0, j = 0; i >> 8);b[j++] = (byte)(c[i] >>> 0);}writeBytes(b, 0, blen);}/*** 調(diào)用DataOutputStream的 writeUTF(String str, DataOutput out) 將一個(gè)字符串寫入文件。*/public final void writeUTF(String str) throws IOException {DataOutputStream.writeUTF(str, this);}private static native void initIDs();private native void close0() throws IOException;static {initIDs();}}

?

?

更多IO內(nèi)容:java_io 體系之目錄

總結(jié)

以上是生活随笔為你收集整理的Java_io体系之RandomAccessFile简介、走进源码及示例——20的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 噜噜噜噜私人影院 | 国产在线拍揄自揄拍无码 | av基地网 | 国产日韩视频在线观看 | 无码熟妇人妻av | 精品国产乱码久久久久久鸭王1 | 黄色录象片| 亚洲第一综合色 | 男人天堂成人 | 黄色视屏网站 | 久久国产片 | 成人精品免费 | 欧美日韩色 | 日韩中文字幕在线看 | 久久色网站 | 国产午夜视频在线 | 国产第4页 | 乱lun合集男男高h | 久久依人网 | 看看黄色片| 国产亚洲精品久久久久久无几年桃 | 精品少妇人妻av免费久久久 | 色婷婷久久五月综合成人 | 精品一性一色一乱农村 | 国产精品久久久久毛片大屁完整版 | 亚洲精品视频国产 | www黄色网 | 九月婷婷综合 | 中文字幕网伦射乱中文 | 久久久国产一区二区 | 欧美伦理片网站 | 六月婷婷七月丁香 | 偷拍欧美亚洲 | 在线免费观看高清视频 | 亚洲成人免费 | 污污网站在线观看 | 中文字幕一区不卡 | 午夜不卡在线观看 | 精品一区二区久久久 | 日韩av在线天堂 | 国产精品久久久久久免费免熟 | 一区二区三区在线 | 麻豆精品一区二区 | 最新网址av | 久久这里只有精品9 | 日本二区视频 | 99久免费精品视频在线观78 | 亚洲拍拍视频 | 日本少妇在线 | 日韩欧美在线观看免费 | 色亚洲天堂| 6080av| 欧美黄色免费网站 | 久久一级黄色片 | 日韩一区二区三区在线看 | 日韩在线资源 | 亚洲综合激情在线 | 久久久久国产精品国产 | 一区二区三区麻豆 | 国产欧美日韩专区发布 | 91免费视频入口 | 国产资源一区 | 国产精品成av人在线视午夜片 | 亚洲图片自拍偷拍 | 国产剧情一区在线 | 国产三级在线观看视频 | 91禁蘑菇在线看 | 久久55 | 又大又硬又爽免费视频 | 色在线免费观看 | 午夜亚洲福利在线老司机 | 色噜噜综合 | 制服丝袜国产精品 | 日本少妇xxxxx | 国产精品视频在线看 | 国产日本在线观看 | 国产高清亚洲 | 亚洲一区二区三区婷婷 | 韩国禁欲系高级感电影 | 日本网站黄色 | 黄视频网站免费看 | 又色又爽又黄 | 亚洲一区二区三区高清 | 超碰中文在线 | 久久综合久久网 | 182tv福利视频 | 91麻豆精品国产91久久久无需广告 | 奇米狠狠操 | 福利影院av | 日本精品一区二区三区四区 | 欧美伦理一区二区 | 日韩不卡在线视频 | 免费美女毛片 | 色一情一区二区三区四区 | 国产精品亚洲成在人线 | 精品一卡二卡三卡 | 一区二区三区视频在线观看免费 | 女同一区二区 | 羞羞答答av |