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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

流与文件(三)

發布時間:2024/4/17 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 流与文件(三) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文件管理

流類關注的是文件內容,而File類關注的是文件在磁盤上的存儲。注意,File類的對象既可以表示文件,也可以表示文件夾。

java.io.File 1.0

File(String name)//創建一個文件/文件夾對象,使用當前目錄下的文件名name,如果文件/文件夾不存在,則不會創建使用這個名字的新文件/文件夾。

File(String path, String name)//創建一個位于path目錄下的名為name的File對象。

File(File dir, String name)//創建一個位于dir目錄下的名為name的File對象。

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

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

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

String[] list(FileNameFilter filter)//FileNameFilter是一個接口,要實現這個接口必須定義accept方法。該方法返回一個boolean值,調用list方法只會顯示accept返回true的文件名數組。

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

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

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

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

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

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

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

?

在不同的系統中,路徑的分隔符不相同,例如windows中使用【\】,Unix中使用【/】,為了實現可移植性,File類中有個separator靜態成員變量,它保存著當前系統的路徑分隔符信息:

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

?

內存映射文件

建立內存映射步驟:

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

2.通過調用FileChannel類的map方法獲得MappedByteBuffer。可以指定需要進行映射的文件區域和映射模式:

FileChannel.MapMode.READ_ONLY:結果緩沖區是只讀的。任何試圖寫入緩沖區的舉動都將引發拋出ReadOnlyBufferException。

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

FileChannel.MapMode.PRIVATE:結果緩沖區可寫,但任何改變都是私有的,僅僅對該緩沖區有效,并不會寫入文件中。

3.一旦獲取了緩沖區,可以用ByteBuffer類和Buffer超類讀寫數據。

例如,將一個文件映射到內存,然后通過訪問內存讀取文件內容:

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)

參數:mode?

? ? ? ? position ? ?被映射區域的起始位置

? ? ? ? size ? ? ? ? ?被映射區域的大小

?

java.nio.ByteBuffer 1.4

byte get()//獲取當前位置的字節并移動到當前位置的下一字節位置。

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

ByteBuffer put(byte b)//在當前位置寫入一個字節并移動到下一字節位置。返回該緩沖區的引用。

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

ByteBuffer get(byte[] destination)//用緩沖區中的字節來填充字節數組。并且將當前位置向后移動讀入的字節數。如果緩沖區中沒有足夠的字節,則不會讀取任何字節,拋出BufferUnderflowException。

ByteBuffer get(byte[] destination, int offset, int length)//用緩沖區中的字節來填充字節數組的一部分。

參數:destination ? ?被填充的字節數組

? ? ? ? offset ? ? ? ? ? ?被填充區域的偏移量

? ? ? ? length ? ? ? ? ? 被填充區域的大小

ByteBuffer put(byte[] source)//將字節數組填充到緩沖區,并且將當前位置向后移動了寫入的字節數。如果緩沖區中沒有足夠的空間,則不會寫入任何字節,并拋出BufferOverflowException。

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

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()//獲取字節順序,返回BIG_ENDIAN或LITTLE_ENDIAN。

ByteBuffer order(ByteOrder order)//設置字節順序。

?

文件映射的內存稱為緩沖區,由Buffer類來表示,Buffer類有一些子類,包括:ByteBuffer,CharBuffer,DoubleBuffer,FloatBuffer,IntBuffer,LongBuffer,ShortBuffer.

一個緩沖區具有

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

2.一個下一數值讀取或寫入的位置(positon)。

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

4.可選地,一個重復進行讀寫操作的標志(mark)。

這些值滿足條件:

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

java.nio.Buffer 1.4

Buffer clear()//設置position到0,limit到capacity,準備寫入。

Buffer flip()//設置position到0,limit到capacity,準備讀取。

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

Buffer mark()//設置mark到position

Buffer reset()//設置position到mark,從而允許mark部分能再次讀或寫。

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

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)

獲取一個char值,或者一系列的char值,從緩沖區的position開始,移動position直到字符都被讀取。

CharBuffer read(CharBuffer destination)

從這個緩沖區中獲取char值,并且把他們放進destination中直到destination到達了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)

?

文件鎖定

多個進程或線程同時處理一個文件時,需要同步機制,文件鎖可以完成這一任務。

要鎖住一個文件,需要調用FileChannel類的lock或tryLock方法,它們的區別是一個阻塞,一個非阻塞。

java.nio.channels.FileChannel 1.4

FileLock lock()

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

FileLock tryLock()

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

?

java.nio.channels.FileLock 1.4

void release()//釋放鎖

注意:文件鎖和操作系統有很大的關系:

1.在一些系統中,文件鎖僅僅是建議性的,因此,一個應用程序未能獲得鎖,也可以對文件進行讀寫操作。

2.在一些系統中,不能同步地鎖住一個文件并把它映射到內存中。

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

4.在某些系統上,關閉通道會釋放Java虛擬機擁有的文件上的全部鎖,因此,應該避免對同一個被鎖定的文件打開多個通道。

5.避免對網絡文件系統中的文件進行鎖定。

轉載于:https://www.cnblogs.com/johnsblog/p/4180601.html

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。