流与文件(三)
文件管理
流類關注的是文件內容,而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
總結
- 上一篇: 【iOS】通知监听
- 下一篇: struts2中拦截器和过滤器的比较