java filechannel api_FileChannel
方法詳細信息
open public static?FileChannel?open?(Path?path,
Set extends OpenOption>?options,
FileAttribute>...?attrs)
throws IOException
打開或創建文件,返回文件通道以訪問該文件。
options參數確定文件的打開方式。 READ和WRITE選項確定是否應打開文件以進行讀取和/或寫入。 如果數組中都沒有包含任何選項(或APPEND選項),則打開文件進行讀取。 默認情況下,在文件開頭處開始讀取或寫入。
除了READ和WRITE ,還可能出現以下選項:
additional options Option Description APPEND If this option is present then the file is opened for writing and each invocation of the channel's write method first advances the position to the end of the file and then writes the requested data. Whether the advancement of the position and the writing of the data are done in a single atomic operation is system-dependent and therefore unspecified. This option may not be used in conjunction with the READ or TRUNCATE_EXISTING options. TRUNCATE_EXISTING If this option is present then the existing file is truncated to a size of 0 bytes. This option is ignored when the file is opened only for reading. CREATE_NEW If this option is present then a new file is created, failing if the file already exists. When creating a file the check for the existence of the file and the creation of the file if it does not exist is atomic with respect to other file system operations. This option is ignored when the file is opened only for reading. CREATE If this option is present then an existing file is opened if it exists, otherwise a new file is created. When creating a file the check for the existence of the file and the creation of the file if it does not exist is atomic with respect to other file system operations. This option is ignored if the CREATE_NEW option is also present or the file is opened only for reading. DELETE_ON_CLOSE When this option is present then the implementation makes a best effort attempt to delete the file when closed by the close method. If the close method is not invoked then a best effort attempt is made to delete the file when the Java virtual machine terminates. SPARSE When creating a new file this option is a hint that the new file will be sparse. This option is ignored when not creating a new file. SYNC Requires that every update to the file's content or metadata be written synchronously to the underlying storage device. (see Synchronized I/O file integrity). DSYNC Requires that every update to the file's content be written synchronously to the underlying storage device. (see Synchronized I/O file integrity).
實現還可以支持其他選項。
attrs參數是文件file-attributes的可選數組,用于在創建文件時以原子方式設置。
新的信道是通過調用創建newFileChannel上創建該提供商方法Path 。
參數
path - 要打開或創建的文件的路徑
options - 指定文件打開方式的選項
attrs - 創建文件時要自動設置的文件屬性的可選列表
結果
一個新的文件通道
異常
path與不支持創建文件通道的提供程序關聯,或者指定了不支持的打開選項,或者該數組包含在創建文件時無法原子設置的屬性
對于默認提供程序,如果打開文件進行讀取,則調用SecurityManager.checkRead(String)方法來檢查讀取訪問權限。
從以下版本開始:
1.7
open public static?FileChannel?open?(Path?path,
OpenOption...?options)
throws IOException
打開或創建文件,返回文件通道以訪問該文件。
調用此方法的行為與調用完全相同
fc.open(file, opts, new FileAttribute>[0]);
其中opts是options數組中指定的一組選項。
參數
path - 要打開或創建的文件的路徑
options - 指定文件打開方式的選項
結果
一個新的文件通道
異常
path與不支持創建文件通道的提供程序關聯,或者指定了不支持的打開選項
對于默認提供程序,如果打開文件進行讀取,則調用SecurityManager.checkRead(String)方法來檢查讀取訪問權限。
從以下版本開始:
1.7
read public abstract?int?read?(ByteBuffer?dst)
throws IOException
從該通道讀取一個字節序列到給定的緩沖區。
從該通道的當前文件位置開始讀取字節,然后使用實際讀取的字節數更新文件位置。
Specified by:
Specified by:
參數
dst - 要傳輸字節的緩沖區
結果
如果通道已到達流末尾,則讀取的字節數(可能為零)或
-1
異常
read public abstract?long?read?(ByteBuffer[]?dsts,
int?offset,
int?length)
throws IOException
從該通道讀取一系列字節到給定緩沖區的子序列。
從該通道的當前文件位置開始讀取字節,然后使用實際讀取的字節數更新文件位置。
Specified by:
參數
dsts - 要傳輸字節的緩沖區
offset - 要傳輸字節的第一個緩沖區的緩沖區數組內的偏移量;
必須是非負數且不大于dsts.length
length - 要訪問的最大緩沖區數;
必須是非負數且不大于dsts.length - offset
結果
如果通道已到達流末尾,則讀取的字節數(可能為零)或
-1
異常
read public final?long?read?(ByteBuffer[]?dsts)
throws IOException
從該通道讀取一系列字節到給定的緩沖區。
從該通道的當前文件位置開始讀取字節,然后使用實際讀取的字節數更新文件位置。
Specified by:
參數
dsts - 要傳輸字節的緩沖區
結果
如果通道已到達流末尾,則讀取的字節數(可能為零)或
-1
異常
write public abstract?int?write?(ByteBuffer?src)
throws IOException
從給定緩沖區向該通道寫入一個字節序列。
除非通道處于附加模式,否則從該通道的當前文件位置開始寫入字節,在這種情況下,位置首先前進到文件的末尾。 如有必要,文件將生長以容納寫入的字節,然后使用實際寫入的字節數更新文件位置。
Specified by:
Specified by:
參數
src - 要從中檢索字節的緩沖區
結果
寫入的字節數,可能為零
異常
write public abstract?long?write?(ByteBuffer[]?srcs,
int?offset,
int?length)
throws IOException
從給定緩沖區的子序列向該通道寫入一個字節序列。
除非通道處于附加模式,否則從該通道的當前文件位置開始寫入字節,在這種情況下,位置首先前進到文件的末尾。 如有必要,文件將生長以容納寫入的字節,然后使用實際寫入的字節數更新文件位置。
Specified by:
參數
srcs - 要從中檢索字節的緩沖區
offset - 要從中檢索字節的第一個緩沖區的緩沖區數組中的偏移量;
必須是非負數且不大于srcs.length
length - 要訪問的最大緩沖區數;
必須是非負數且不大于srcs.length - offset
結果
寫入的字節數,可能為零
異常
write public final?long?write?(ByteBuffer[]?srcs)
throws IOException
從給定的緩沖區向該通道寫入一個字節序列。
除非通道處于附加模式,否則從該通道的當前文件位置開始寫入字節,在這種情況下,位置首先前進到文件的末尾。 如有必要,文件將生長以容納寫入的字節,然后使用實際寫入的字節數更新文件位置。
Specified by:
參數
srcs - 要從中檢索字節的緩沖區
結果
寫入的字節數,可能為零
異常
position public abstract?long?position()
throws IOException
返回此通道的文件位置。
Specified by:
結果
此通道的文件位置,一個非負整數,計算從文件開頭到當前位置的字節數
異常
position public abstract?FileChannel?position?(long?newPosition)
throws IOException
設置此通道的文件位置。
將位置設置為大于文件當前大小的值是合法的,但不會更改文件的大小。 稍后嘗試在這樣的位置讀取字節將立即返回文件結束指示。 稍后嘗試在這樣的位置寫入字節將導致文件增長以容納新字節; 未指定前一個文件結尾和新寫入字節之間的任何字節的值。
Specified by:
參數
newPosition - 新位置,一個非負整數,用于計算文件開頭的字節數
結果
這個文件頻道
異常
size public abstract?long?size()
throws IOException
返回此通道文件的當前大小。
Specified by:
結果
此通道文件的當前大小,以字節為單位
異常
truncate public abstract?FileChannel?truncate?(long?size)
throws IOException
將此頻道的文件截斷為給定大小。
如果給定大小小于文件的當前大小,則文件將被截斷,丟棄文件新端之外的任何字節。 如果給定大小大于或等于文件的當前大小,則不修改該文件。 在任何一種情況下,如果此通道的文件位置大于給定大小,則將其設置為該大小。
force public abstract?void?force?(boolean?metaData)
throws IOException
強制將此通道文件的任何更新寫入包含它的存儲設備。
如果此通道的文件駐留在本地存儲設備上,則當此方法返回時,保證自創建此通道以來對文件所做的所有更改,或者自上次調用此方法以來,該文件都將寫入該設備。 這對于確保在系統崩潰時不會丟失關鍵信息非常有用。
如果文件不駐留在本地設備上,則不會進行此類保證。
metaData參數可用于限制此方法需要執行的I / O操作數。 為此參數傳遞false表示只需要將文件內容的更新寫入存儲; 傳遞true表示必須寫入文件內容和元數據的更新,這通常需要至少一次I / O操作。 此參數是否實際具有任何效果取決于底層操作系統,因此未指定。
即使僅打開通道進行讀取,調用此方法也可能導致I / O操作發生。 例如,某些操作系統將最后訪問時間作為文件元數據的一部分進行維護,并且每次讀取文件時都會更新此時間。 這是否實際完成是依賴于系統的,因此未指定。
此方法僅保證強制通過此類中定義的方法對此通道的文件進行更改。 它可能會也可能不會強制通過修改通過調用map方法獲得的mapped byte buffer的內容進行更改 。 調用映射字節緩沖區的force方法將強制寫入對緩沖區內容的更改。
參數
metaData - 如果是true則需要使用此方法強制更改文件的內容和要寫入存儲的元數據;
否則,只需強制內容更改即可寫入
異常
transferTo public abstract?long?transferTo?(long?position,
long?count,
WritableByteChannel?target)
throws IOException
將字節從此通道的文件傳輸到給定的可寫字節通道。
嘗試從該通道文件中的給定position開始讀取最多count個字節,并將它們寫入目標通道。 調用此方法可能會也可能不會傳輸所有請求的字節; 是否這樣做取決于渠道的性質和狀態。 如果此通道的文件包含從給定的position開始的少于count字節,或者目標通道是非阻塞且其輸出緩沖區中的count字節少于position ,則傳輸的字節數少于所請求的字節數。
此方法不會修改此通道的位置。 如果給定位置大于文件的當前大小,則不傳輸任何字節。 如果目標通道有一個位置,則從該位置開始寫入字節,然后該位置按寫入的字節數遞增。
此方法可能比從此通道讀取并寫入目標通道的簡單循環更有效。 許多操作系統可以直接從文件系統緩存向目標通道傳輸字節,而無需實際復制它們。
參數
position - 文件在轉移開始時的位置;
必須是非負面的
count - 要傳輸的最大字節數;
必須是非負面的
target - 目標通道
結果
實際傳輸的字節數,可能為零
異常
transferFrom public abstract?long?transferFrom?(ReadableByteChannel?src,
long?position,
long?count)
throws IOException
從給定的可讀字節通道將字節傳輸到此通道的文件中。
嘗試從源通道讀取最多count個字節,并從給定的position開始將它們寫入此通道的文件。 調用此方法可能會也可能不會傳輸所有請求的字節; 是否這樣做取決于渠道的性質和狀態。 如果源通道剩余少于count個字節,或者源通道非阻塞且輸入緩沖區中立即可用的字節數少于count少于count字節數。
此方法不會修改此通道的位置。 如果給定位置大于文件的當前大小,則不傳輸任何字節。 如果源通道有一個位置,則從該位置開始讀取字節,然后將位置增加讀取的字節數。
此方法可能比從源通道讀取并寫入此通道的簡單循環更有效。 許多操作系統可以直接從源通道將字節傳輸到文件系統緩存中,而無需實際復制它們。
參數
src - 源通道
position - 文件在轉移開始時的位置;
必須是非負面的
count - 要傳輸的最大字節數;
必須是非負面的
結果
實際傳輸的字節數,可能為零
異常
read public abstract?int?read?(ByteBuffer?dst,
long?position)
throws IOException
從給定文件位置開始,從該通道讀取一個字節序列到給定緩沖區。
此方法的工作方式與read(ByteBuffer)方法相同,不同之處在于從給定文件位置開始而不是在通道的當前位置讀取字節。 此方法不會修改此通道的位置。 如果給定位置大于文件的當前大小,則不讀取任何字節。
參數
dst - 要傳輸字節的緩沖區
position - 要開始傳輸的文件位置;
必須是非負面的
結果
如果給定位置大于或等于文件的當前大小,則讀取的字節數(可能為零)或
-1
異常
write public abstract?int?write?(ByteBuffer?src,
long?position)
throws IOException
從給定的緩沖區向該通道寫入一個字節序列,從給定的文件位置開始。
此方法的工作方式與write(ByteBuffer)方法相同,不同之處在于從給定文件位置開始而不是在通道的當前位置開始寫入字節。 此方法不會修改此通道的位置。 如果給定位置大于文件的當前大小,則文件將增長以容納新字節; 未指定前一個文件結尾和新寫入字節之間的任何字節的值。
參數
src - 要從中傳輸字節的緩沖區
position - 傳輸開始的文件位置;
必須是非負面的
結果
寫入的字節數,可能為零
異常
map public abstract?MappedByteBuffer?map?(FileChannel.MapMode?mode,
long?position,
long?size)
throws IOException
將此頻道文件的某個區域直接映射到內存中。
文件的區域可以以三種模式之一映射到存儲器中:
讀/寫:對結果緩沖區所做的更改最終會傳播到文件中; 它們可能會或可能不會被映射到同一文件的其他程序看到。
專用:對生成的緩沖區所做的更改不會傳播到文件,也不會對映射了同一文件的其他程序可見; 相反,它們將導致創建緩沖區的修改部分的私有副本。
對于只讀映射,必須打開此通道才能讀取; 對于讀/寫或私有映射,必須已打開此通道以進行讀取和寫入。
此方法返回的mapped byte buffer的位置為零,限制和容量為size ; 它的標記將是不確定的。 緩沖區及其表示的映射將保持有效,直到緩沖區本身被垃圾收集。
映射一旦建立,就不依賴于用于創建映射的文件通道。 特別是,關閉通道對映射的有效性沒有影響。
內存映射文件的許多細節本質上依賴于底層操作系統,因此未指定。 未指定請求的區域未完全包含在此通道的文件中時此方法的行為。 是否通過此程序或其他程序對基礎文件的內容或大小所做的更改傳播到緩沖區是未指定的。 未指定緩沖區更改傳播到文件的速率。
對于大多數操作系統,將文件映射到內存比通過通常的read和write方法讀取或寫入幾十千字節的數據更昂貴。 從性能的角度來看,通常只需要將相對較大的文件映射到內存中。
lock public abstract?FileLock?lock?(long?position,
long?size,
boolean?shared)
throws IOException
獲取此通道文件的給定區域的鎖定。
調用此方法將阻塞,直到可以鎖定該區域,關閉此通道,或者中斷調用線程,以先到者為準。
如果在調用此方法期間此通道被另一個線程關閉,則將拋出AsynchronousCloseException 。
如果在等待獲取鎖定時調用線程被中斷,則將設置其中斷狀態并拋出FileLockInterruptionException 。 如果在調用此方法時設置了調用程序的中斷狀態,則會立即拋出該異常; 線程的中斷狀態不會改變。
由position和size參數指定的區域不需要包含在實際底層文件中,甚至不要包含在實際底層文件中。 鎖定區域的大小是固定的; 如果鎖定區域最初包含文件的末尾并且文件超出該區域,那么該文件的新部分將不會被鎖定。 如果預計文件的大小會增加并且需要鎖定整個文件,則應鎖定從零開始并且不小于文件的預期最大大小的區域。
某些操作系統不支持共享鎖,在這種情況下,對共享鎖的請求會自動轉換為獨占鎖的請求。 可以通過調用生成的鎖對象的isShared方法來測試新獲取的鎖是共享的還是獨占的。
文件鎖代表整個Java虛擬機。 它們不適合控制同一虛擬機中多個線程對文件的訪問。
參數
position - 鎖定區域開始的位置;
必須是非負面的
size - 鎖定區域的大小;
必須為非負數,且總和position + size必須為非負數
shared - true請求共享鎖,在這種情況下,此通道必須打開才能讀取(并可能寫入);
false請求獨占鎖定,在這種情況下,此通道必須打開才能寫入(并可能讀取)
結果
表示新獲取的鎖的鎖對象
異常
shared是
false但此信道未開通以進行寫入
另請參見:
lock public final?FileLock?lock()
throws IOException
獲取此頻道文件的獨占鎖定。
調用fc.lock()形式的此方法的行為與調用的方式完全相同
fc.lock(0L, Long.MAX_VALUE, false)
tryLock public abstract?FileLock?tryLock?(long?position,
long?size,
boolean?shared)
throws IOException
嘗試獲取此頻道文件的給定區域的鎖定。
此方法不會阻止。 調用始終立即返回,要么已獲取所請求區域的鎖定,要么未能執行此操作。 如果由于另一個程序持有重疊鎖而無法獲取鎖定,則返回null 。 如果由于任何其他原因而無法獲取鎖定,則會拋出相應的異常。
由position和size參數指定的區域不需要包含在實際底層文件中,甚至不要包含在實際底層文件中。 鎖定區域的大小是固定的; 如果鎖定區域最初包含文件的末尾并且文件超出該區域,那么該文件的新部分將不會被鎖定。 如果預計文件的大小會增加并且需要鎖定整個文件,則應鎖定從零開始并且不小于文件的預期最大大小的區域。
某些操作系統不支持共享鎖,在這種情況下,對共享鎖的請求會自動轉換為獨占鎖的請求。 可以通過調用生成的鎖定對象的isShared方法來測試新獲取的鎖是共享的還是獨占的。
文件鎖代表整個Java虛擬機。 它們不適合控制同一虛擬機中多個線程對文件的訪問。
參數
position - 鎖定區域開始的位置;
必須是非負面的
size - 鎖定區域的大小;
必須為非負數,且總和position + size必須為非負數
shared -
true請求共享鎖,
false請求獨占鎖
結果
表示新獲取的鎖的鎖對象,如果由于另一個程序持有重疊鎖而無法獲取鎖,
null
異常
另請參見:
tryLock public final?FileLock?tryLock()
throws IOException
嘗試獲取此頻道文件的獨占鎖定。
調用fc.tryLock()形式的此方法的行為與調用的方式完全相同
fc.tryLock(0L, Long.MAX_VALUE, false)
結果
表示新獲取的鎖的鎖對象,如果由于另一個程序持有重疊鎖而無法獲取鎖,
null
異常
另請參見:
總結
以上是生活随笔為你收集整理的java filechannel api_FileChannel的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中b的平方表示_第七届蓝桥杯Ja
- 下一篇: java hashmap扩容大小_Has