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

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

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

流与文件(三)

發(fā)布時(shí)間:2024/4/17 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 流与文件(三) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文件管理

流類關(guān)注的是文件內(nèi)容,而File類關(guān)注的是文件在磁盤上的存儲(chǔ)。注意,File類的對(duì)象既可以表示文件,也可以表示文件夾。

java.io.File 1.0

File(String name)//創(chuàng)建一個(gè)文件/文件夾對(duì)象,使用當(dāng)前目錄下的文件名name,如果文件/文件夾不存在,則不會(huì)創(chuàng)建使用這個(gè)名字的新文件/文件夾。

File(String path, String name)//創(chuàng)建一個(gè)位于path目錄下的名為name的File對(duì)象。

File(File dir, String name)//創(chuàng)建一個(gè)位于dir目錄下的名為name的File對(duì)象。

boolean createNewFile()//以File對(duì)象是定的名字創(chuàng)建一個(gè)新的文件,成功返回true。

boolean mkdir()//以File對(duì)象指定的名字創(chuàng)建一個(gè)新的文件夾,成功返回true。

String[] list()//如果File對(duì)象表示一個(gè)文件夾,則返回該文件夾下的所有文件名組成的數(shù)組。

String[] list(FileNameFilter filter)//FileNameFilter是一個(gè)接口,要實(shí)現(xiàn)這個(gè)接口必須定義accept方法。該方法返回一個(gè)boolean值,調(diào)用list方法只會(huì)顯示accept返回true的文件名數(shù)組。

boolean exists()//如果文件/文件夾存在返回true,否則返回false。

File getCanonicalFile()//返回一個(gè)包含該File對(duì)象絕對(duì)路徑的File對(duì)象。

String getCanonicalFile()//返回一個(gè)包含該File對(duì)象絕對(duì)路徑的字符串。

String getName()//返回File對(duì)象的文件名字符串(不包括路徑信息)。

boolean isDirectory()//File對(duì)象表示文件夾返回true,否則返回false。

boolean isFile()//File對(duì)象表示文件返回true,否則返回false。

還有一些其他方法可以查詢java文檔。?

?

在不同的系統(tǒng)中,路徑的分隔符不相同,例如windows中使用【\】,Unix中使用【/】,為了實(shí)現(xiàn)可移植性,File類中有個(gè)separator靜態(tài)成員變量,它保存著當(dāng)前系統(tǒng)的路徑分隔符信息:

File foo = new File("Documents" + File.separator + "data.txt");

?

內(nèi)存映射文件

建立內(nèi)存映射步驟:

1.為文件獲取通道(channel),通過(guò)FileInputStream/FileOutputStream或RandomAccessFile類中的getChannel方法。

2.通過(guò)調(diào)用FileChannel類的map方法獲得MappedByteBuffer。可以指定需要進(jìn)行映射的文件區(qū)域和映射模式:

FileChannel.MapMode.READ_ONLY:結(jié)果緩沖區(qū)是只讀的。任何試圖寫入緩沖區(qū)的舉動(dòng)都將引發(fā)拋出ReadOnlyBufferException。

FileChannel.MapMode.READ_WRITE:結(jié)果緩沖區(qū)可寫,這些改變會(huì)及時(shí)寫回文件中。注意,如果其他程序也映射了同一個(gè)文件,它并不會(huì)立即觀察到這些變化。

FileChannel.MapMode.PRIVATE:結(jié)果緩沖區(qū)可寫,但任何改變都是私有的,僅僅對(duì)該緩沖區(qū)有效,并不會(huì)寫入文件中。

3.一旦獲取了緩沖區(qū),可以用ByteBuffer類和Buffer超類讀寫數(shù)據(jù)。

例如,將一個(gè)文件映射到內(nèi)存,然后通過(guò)訪問(wèn)內(nèi)存讀取文件內(nèi)容:

public void myRead(String filename) {FileInputStream in = new FileInputStream(filename);FileChannel channel = in.getChannel();int length = (int)channel.size();MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, length);while(buffer.hasRemaining()){byte b = buffer.get();...//dealing with the byte } }

java.nio.channels.FileChannel 1.4

MappedByteBuffer map(FileChannel.MapMode mode, long position, long size)

參數(shù):mode?

? ? ? ? position ? ?被映射區(qū)域的起始位置

? ? ? ? size ? ? ? ? ?被映射區(qū)域的大小

?

java.nio.ByteBuffer 1.4

byte get()//獲取當(dāng)前位置的字節(jié)并移動(dòng)到當(dāng)前位置的下一字節(jié)位置。

byte get(int index)//獲取指定位置的字節(jié)

ByteBuffer put(byte b)//在當(dāng)前位置寫入一個(gè)字節(jié)并移動(dòng)到下一字節(jié)位置。返回該緩沖區(qū)的引用。

ByteBuffer put(int index, byte b)//在指定位置寫入一個(gè)字節(jié)。

ByteBuffer get(byte[] destination)//用緩沖區(qū)中的字節(jié)來(lái)填充字節(jié)數(shù)組。并且將當(dāng)前位置向后移動(dòng)讀入的字節(jié)數(shù)。如果緩沖區(qū)中沒(méi)有足夠的字節(jié),則不會(huì)讀取任何字節(jié),拋出BufferUnderflowException。

ByteBuffer get(byte[] destination, int offset, int length)//用緩沖區(qū)中的字節(jié)來(lái)填充字節(jié)數(shù)組的一部分。

參數(shù):destination ? ?被填充的字節(jié)數(shù)組

? ? ? ? offset ? ? ? ? ? ?被填充區(qū)域的偏移量

? ? ? ? length ? ? ? ? ? 被填充區(qū)域的大小

ByteBuffer put(byte[] source)//將字節(jié)數(shù)組填充到緩沖區(qū),并且將當(dāng)前位置向后移動(dòng)了寫入的字節(jié)數(shù)。如果緩沖區(qū)中沒(méi)有足夠的空間,則不會(huì)寫入任何字節(jié),并拋出BufferOverflowException。

ByteBuffer put(byte[] source, int offset, int length)//將字節(jié)數(shù)組的一部分填充到緩沖區(qū)中。

Xxx getXxx()

Xxx getXxx(int index)

ByteBuffer putXxx(xxx value)

ByteBuffer putXxx(int index, xxx value)

//Xxx是Int,Long,Short,Char, Float或者Double

ByteOrder order()//獲取字節(jié)順序,返回BIG_ENDIAN或LITTLE_ENDIAN。

ByteBuffer order(ByteOrder order)//設(shè)置字節(jié)順序。

?

文件映射的內(nèi)存稱為緩沖區(qū),由Buffer類來(lái)表示,Buffer類有一些子類,包括:ByteBuffer,CharBuffer,DoubleBuffer,FloatBuffer,IntBuffer,LongBuffer,ShortBuffer.

一個(gè)緩沖區(qū)具有

1.一個(gè)絕不會(huì)改變的容量(capacity)。

2.一個(gè)下一數(shù)值讀取或?qū)懭氲奈恢?positon)。

3.一個(gè)限制,超出這個(gè)限制的讀寫是無(wú)意義的(limit)。

4.可選地,一個(gè)重復(fù)進(jìn)行讀寫操作的標(biāo)志(mark)。

這些值滿足條件:

0<=mark<=position<=limit<=capacity

java.nio.Buffer 1.4

Buffer clear()//設(shè)置position到0,limit到capacity,準(zhǔn)備寫入。

Buffer flip()//設(shè)置position到0,limit到capacity,準(zhǔn)備讀取。

Buffer rewind()//設(shè)置positon到0,limit不變,準(zhǔn)備再次讀取。

Buffer mark()//設(shè)置mark到position

Buffer reset()//設(shè)置position到mark,從而允許mark部分能再次讀或?qū)憽?/p>

int remaining()//返回limit-position,即還能夠讀寫的數(shù)量。

int positon()//返回position

int capacity()//返回capacity

?

java.nio.CharBuffer 1.4

char get()

CharBuffer get(char[] destination)

CharBuffer get(char[] destination,int offset, int length)

獲取一個(gè)char值,或者一系列的char值,從緩沖區(qū)的position開始,移動(dòng)position直到字符都被讀取。

CharBuffer read(CharBuffer destination)

從這個(gè)緩沖區(qū)中獲取char值,并且把他們放進(jìn)destination中直到destination到達(dá)了limit。

CharBuffer put(char c)

CharBuffer put(char[] source)

CharBuffer put(char[] source, int offset, int length)

CharBuffer put(String source)

CharBuffer put(CharBuffer source)

?

文件鎖定

多個(gè)進(jìn)程或線程同時(shí)處理一個(gè)文件時(shí),需要同步機(jī)制,文件鎖可以完成這一任務(wù)。

要鎖住一個(gè)文件,需要調(diào)用FileChannel類的lock或tryLock方法,它們的區(qū)別是一個(gè)阻塞,一個(gè)非阻塞。

java.nio.channels.FileChannel 1.4

FileLock lock()

FileLock lock(long position, long size, boolean shared)//鎖住文件的一部分,position表示鎖住部分的起始位置,size表示鎖住部分的大小,shared表示是否為共享鎖。共享鎖都可讀,但只有一個(gè)可寫。

FileLock tryLock()

FileLock tryLock(long position, long size, boolean shared)

?

java.nio.channels.FileLock 1.4

void release()//釋放鎖

注意:文件鎖和操作系統(tǒng)有很大的關(guān)系:

1.在一些系統(tǒng)中,文件鎖僅僅是建議性的,因此,一個(gè)應(yīng)用程序未能獲得鎖,也可以對(duì)文件進(jìn)行讀寫操作。

2.在一些系統(tǒng)中,不能同步地鎖住一個(gè)文件并把它映射到內(nèi)存中。

3.文件鎖是整個(gè)Java虛擬機(jī)持有的,如果虛擬機(jī)已經(jīng)擁有了對(duì)同一個(gè)文件的重疊鎖,則lock或者tryLock方法會(huì)拋出異常。

4.在某些系統(tǒng)上,關(guān)閉通道會(huì)釋放Java虛擬機(jī)擁有的文件上的全部鎖,因此,應(yīng)該避免對(duì)同一個(gè)被鎖定的文件打開多個(gè)通道。

5.避免對(duì)網(wǎng)絡(luò)文件系統(tǒng)中的文件進(jìn)行鎖定。

轉(zhuǎn)載于:https://www.cnblogs.com/johnsblog/p/4180601.html

總結(jié)

以上是生活随笔為你收集整理的流与文件(三)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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