|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
java.lang.Object java.nio.channels.spi.AbstractInterruptibleChannel java.nio.channels.FileChannel
public abstract class FileChannel
用於讀取、寫入、映射和操作檔案的通道。
檔案通道在其檔案中有一個當前 position,可對其進行查詢
和
修改
。該檔案本身包含一個可讀寫的長度可變的位元組序列,並且可以查詢該檔案的當前
大小
。寫入的位元組超出檔案的當前大小時,則增加檔案的大小;
截取
該檔案時,則減小檔案的大小。檔案可能還有某個相關聯的元資料,如存取權限、內容型別和最後的修改時間;此類別未定義存取元資料的方法。
除了位元組通道中常見的讀取、寫入和關閉操作外,此類別還定義了下列特定於檔案的操作:
將檔案中的某個區域直接映射
到記憶體中;對於較大的檔案,這通常比調用普通的 read 或 write 方法更為高效。
強制
對底層存儲設備進行檔案的更新,確保在系統崩潰時不丟失資料。
以一種可被很多作業系統優化為直接向檔案系統快取記憶體發送或從中讀取的高速傳輸方法,將位元組從檔案傳輸到某個其他通道
中,
反之亦然
。
可以鎖定
某個檔案區域,以阻止其他程序對其進行存取。
多個共時執行緒可安全地使用檔案通道。可隨時調用關閉
方法,正如 Channel
介面中所指定的。對於涉及通道位置或者可以更改其檔案大小的操作,在任意給定時間只能進行一個這樣的操作;如果嘗試在第一個操作仍在進行時發起第二個操作,則會導致在第一個操作完成之前阻塞第二個操作。可以共時處理其他操作,特別是那些採用顯式位置的操作;但是否共時處理則取決於基礎實作,因此是未指定的。
確保此類別的實例所提供的檔案視圖與同一程序中其他實例所提供的相同檔案視圖是一致的。但是,此類別的實例所提供的視圖不一定與其他共時運行的程序所看到的視圖一致,這取決於底層作業系統所執行的緩衝策略和各種網路檔案系統協議所引入的延遲。不管其他程序是以何種語言編寫的,而且也不管是運行在相同機器還是不同機器上都是如此。此種不一致的確切性質取決於系統,因此是未指定的。
此類別沒有定義打開現有檔案或創建新檔案的方法,以後的版本中可能添加這些方法。在此版本中,可從現有的 FileInputStream
、FileOutputStream
或 RandomAccessFile
物件獲得檔案通道,方法是調用該物件的 getChannel 方法,這會返回一個連接到相同底層檔案的檔案通道。
檔案通道的狀態與其 getChannel 返回該通道的物件密切相關。顯式或者通過讀取或寫入位元組來更改通道的位置將更改發起物件的檔案位置,反之亦然。通過檔案通道更改此檔案的長度將更改通過發起物件看到的長度,反之亦然。通過寫入位元組更改此檔案的內容將更改發起物件所看到的內容,反之亦然。
此類別在各種情況下指定要求“允許讀取操作”、“允許寫入操作”或“允許讀取和寫入操作”的某個實例。通過 如果從檔案輸出串流中獲得了允許進行寫入操作的檔案通道,並且該輸出串流是通過調用
FileInputStream
實例的 getChannel
方法所獲得的通道將允許進行讀取操作。通過 FileOutputStream
實例的 getChannel
方法所獲得的通道將允許進行寫入操作。最後,如果使用網要 "r" 創建 RandomAccessFile
實例,則通過該實例的 getChannel
方法所獲得的通道將允許進行讀取操作,如果使用網要 "rw" 創建實例,則獲得的通道將允許進行讀取和寫入操作。
FileOutputStream(File,boolean)
建構子且為第二個參數傳入 true 來創建的,則該檔案通道可能處於添加網要。在此網要中,每次調用相關的寫入操作都會首先將位置移到檔案的末尾,然後再寫入請求的資料。在單個原子操作中是否移動位置和寫入資料是與系統相關的,因此是未指定的。
FileInputStream.getChannel()
,
FileOutputStream.getChannel()
,
RandomAccessFile.getChannel()
巢狀類別摘要 | |
---|---|
static class |
FileChannel.MapMode
檔案映射網要的型別安全的列舉。 |
建構子摘要 | |
---|---|
protected |
FileChannel()
初始化此類別的一個新實例。 |
方法摘要 | |
---|---|
abstract void |
force(boolean metaData)
強制將所有對此通道的檔案更新寫入包含該檔案的存儲設備中。 |
FileLock |
lock()
獲取對此通道的檔案的獨佔鎖定。 |
abstract FileLock |
lock(long position,
long size,
boolean shared)
獲取此通道的檔案給定區域上的鎖定。 |
abstract MappedByteBuffer |
map(FileChannel.MapMode mode,
long position,
long size)
將此通道的檔案區域直接映射到記憶體中。 |
abstract long |
position()
返回此通道的檔案位置。 |
abstract FileChannel |
position(long newPosition)
設置此通道的檔案位置。 |
abstract int |
read(ByteBuffer dst)
將位元組序列從此通道讀入給定的緩衝區。 |
long |
read(ByteBuffer[] dsts)
將位元組序列從此通道讀入給定的緩衝區。 |
abstract long |
read(ByteBuffer[] dsts,
int offset,
int length)
將位元組序列從此通道讀入給定緩衝區的子序列中。 |
abstract int |
read(ByteBuffer dst,
long position)
從給定的檔案位置開始,從此通道讀取位元組序列,並寫入給定的緩衝區。 |
abstract long |
size()
返回此通道的檔案的當前大小。 |
abstract long |
transferFrom(ReadableByteChannel src,
long position,
long count)
將位元組從給定的可讀取位元組通道傳輸到此通道的檔案中。 |
abstract long |
transferTo(long position,
long count,
WritableByteChannel target)
將位元組從此通道的檔案傳輸到給定的可寫入位元組通道。 |
abstract FileChannel |
truncate(long size)
將此通道的檔案截取為給定大小。 |
FileLock |
tryLock()
試圖獲取對此通道的檔案的獨佔鎖定。 |
abstract FileLock |
tryLock(long position,
long size,
boolean shared)
試圖獲取對此通道的檔案給定區域的鎖定。 |
abstract int |
write(ByteBuffer src)
將位元組序列從給定的緩衝區寫入此通道。 |
long |
write(ByteBuffer[] srcs)
將位元組序列從給定的緩衝區寫入此通道。 |
abstract long |
write(ByteBuffer[] srcs,
int offset,
int length)
將位元組序列從給定緩衝區的子序列寫入此通道。 |
abstract int |
write(ByteBuffer src,
long position)
從給定的檔案位置開始,將位元組序列從給定緩衝區寫入此通道。 |
從類別 java.nio.channels.spi.AbstractInterruptibleChannel 繼承的方法 |
---|
begin, close, end, implCloseChannel, isOpen |
從類別 java.lang.Object 繼承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
從介面 java.nio.channels.Channel 繼承的方法 |
---|
close, isOpen |
建構子詳細資訊 |
---|
protected FileChannel()
方法詳細資訊 |
---|
public abstract int read(ByteBuffer dst) throws IOException
從此通道的當前檔案位置開始讀取位元組,然後使用實際讀取的位元組數更新該檔案位置。否則此方法的行為與 ReadableByteChannel
介面中指定的行為完全相同。
ReadableByteChannel
中的 read
dst
- 要向其中傳輸位元組的緩衝區
ClosedChannelException
- 如果此通道已關閉
AsynchronousCloseException
- 如果正在進行讀取操作時另一個執行緒關閉了此通道
ClosedByInterruptException
- 如果正在進行讀取操作時另一個執行緒中斷了當前執行緒,因此關閉了該通道並將當前執行緒設置為中斷狀態
IOException
- 如果發生其他 I/O 錯誤public abstract long read(ByteBuffer[] dsts, int offset, int length) throws IOException
從此通道的當前檔案位置開始讀取位元組,然後使用實際讀取的位元組數更新該檔案位置。否則此方法的行為與 ScatteringByteChannel
介面中指定的行為完全相同。
ScatteringByteChannel
中的 read
dsts
- 要向其中傳輸位元組的緩衝區offset
- 第一個緩衝區(位元組傳輸到該緩衝區中)在緩衝區陣列中的偏移量;必須為非負數並且不能大於 dsts.lengthlength
- 要存取的最大緩衝區數;必須為非負數並且不能大於 dsts.length - offset
ClosedChannelException
- 如果此通道已關閉
AsynchronousCloseException
- 如果正在進行讀取操作時另一個執行緒關閉了此通道
ClosedByInterruptException
- 如果正在進行讀取操作時另一個執行緒中斷了當前執行緒,因此關閉了該通道並將當前執行緒設置為中斷狀態
IOException
- 如果發生其他 I/O 錯誤public final long read(ByteBuffer[] dsts) throws IOException
從此通道的當前檔案位置開始讀取位元組,然後使用實際讀取的位元組數更新該檔案位置。否則此方法的行為與 ScatteringByteChannel
介面中指定的行為完全相同。
ScatteringByteChannel
中的 read
dsts
- 要向其中傳輸位元組的緩衝區
ClosedChannelException
- 如果此通道已關閉
AsynchronousCloseException
- 如果正在進行讀取操作時另一個執行緒關閉了此通道
ClosedByInterruptException
- 如果正在進行讀取操作時另一個執行緒中斷了當前執行緒,因此關閉了該通道並將當前執行緒設置為中斷狀態
IOException
- 如果發生其他 I/O 錯誤public abstract int write(ByteBuffer src) throws IOException
從此通道的當前檔案位置開始寫入位元組,但是如果該通道處於添加網要,則首先將該位置移到檔案的末尾。如有必要,可以擴大檔案以容納寫入的位元組,然後使用實際寫入的位元組數更新該檔案位置。否則此方法的行為與 WritableByteChannel
介面所指定的行為完全相同。
WritableByteChannel
中的 write
src
- 要從中獲取位元組的緩衝區
ClosedChannelException
- 如果此通道已關閉
AsynchronousCloseException
- 如果正在進行寫入操作時另一個執行緒關閉了此通道
ClosedByInterruptException
- 如果正在進行寫入操作時另一個執行緒中斷了當前執行緒,因此關閉了該通道並將當前執行緒的狀態設置為中斷
IOException
- 如果發生其他 I/O 錯誤public abstract long write(ByteBuffer[] srcs, int offset, int length) throws IOException
從此通道的當前檔案位置開始寫入位元組,但是如果該通道處於添加網要,則首先將位置移到檔案的末尾。如有必要,可以擴大檔案以容納寫入的位元組,然後使用實際寫入的位元組數更新該檔案位置。否則此方法的行為與 GatheringByteChannel
介面中指定的行為完全相同。
GatheringByteChannel
中的 write
offset
- 第一個緩衝區(要獲取該緩衝區中的位元組)在緩衝區陣列中的偏移量;必須為非負數並且不能大於 srcs.lengthlength
- 要存取的最大緩衝區數;必須為非負數並且不能大於 srcs.length - offset
ClosedChannelException
- 如果此通道已關閉
AsynchronousCloseException
- 如果正在進行寫入操作時另一個執行緒關閉了此通道
ClosedByInterruptException
- 如果正在進行寫入操作時另一個執行緒中斷了當前執行緒,因此關閉了該通道並將當前執行緒的狀態設置為中斷
IOException
- 如果發生其他 I/O 錯誤public final long write(ByteBuffer[] srcs) throws IOException
從此通道的當前檔案位置開始寫入位元組,但是如果該通道處於添加網要,則首先將位置移到檔案的末尾。如有必要,可以擴大檔案以容納寫入的位元組,然後使用實際寫入的位元組數更新該檔案位置。否則此方法的行為與 GatheringByteChannel
介面中指定的行為完全相同。
GatheringByteChannel
中的 write
ClosedChannelException
- 如果此通道已關閉
AsynchronousCloseException
- 如果正在進行寫入操作時另一個執行緒關閉了此通道
ClosedByInterruptException
- 如果正在進行寫入操作時另一個執行緒中斷了當前執行緒,因此關閉了該通道並將當前執行緒的狀態設置為中斷
IOException
- 如果發生其他 I/O 錯誤public abstract long position() throws IOException
ClosedChannelException
- 如果此通道已關閉
IOException
- 如果發生其他 I/O 錯誤public abstract FileChannel position(long newPosition) throws IOException
將該位置設置為大於檔案當前大小的值是合法的,但這不會更改檔案的大小。稍後試圖在這樣的位置讀取位元組將立即返回已到達檔案末尾的指示。稍後試圖在這種位置寫入位元組將導致檔案擴大,以容納新的位元組;在以前檔案末尾和新寫入位元組之間的位元組值是未指定的。
newPosition
- 新位置,這是一個非負整數,它計算從檔案開始的位元組數
ClosedChannelException
- 如果此通道已關閉
IllegalArgumentException
- 如果 newPosition 為負
IOException
- 如果發生其他 I/O 錯誤public abstract long size() throws IOException
ClosedChannelException
- 如果此通道已關閉
IOException
- 如果發生其他 I/O 錯誤public abstract FileChannel truncate(long size) throws IOException
如果給定大小小於該檔案的當前大小,則截取該檔案,丟棄檔案新末尾後面的所有位元組。如果給定大小大於等於該檔案的當前大小,則不修改檔案。無論是哪種情況,如果此通道的檔案位置大於給定大小,則將位置設置為該大小。
size
- 新的大小,非負的位元組計數
NonWritableChannelException
- 如果不允許對此通道進行寫入操作
ClosedChannelException
- 如果此通道已關閉
IllegalArgumentException
- 如果新的 size 為負
IOException
- 如果發生其他 I/O 錯誤public abstract void force(boolean metaData) throws IOException
如果此通道的檔案駐留在本地存儲設備上,則此方法返回時可保證:在此通道創建後或在最後一次調用此方法後對該檔案進行的所有更改都已寫入該設備中。這對確保在系統崩潰時不會丟失重要資訊特別有用。
如果該檔案不在本地設備上,則無法提供這樣的保證。
metaData 參數可用於限制此方法必需執行的 I/O 操作數量。為此參數傳入 false 指示只需將對檔案內容的更新寫入存儲設備;傳入 true 則指示必須寫入對檔案內容和元資料的更新,這通常需要一個以上的 I/O 操作。此參數是否實際有效取決於底層作業系統,因此是未指定的。
調用此方法可能導致發生 I/O 操作,即使該通道僅允許進行讀取操作時也是如此。例如,某些作業系統將最後一次存取的時間作為元資料的一部分進行維護,每當讀取檔案時就更新此時間。實際是否執行操作是與作業系統相關的,因此是未指定的。
此方法只保證強制進行通過此類別中已定義的方法對此通道的檔案所進行的更改。此方法不一定強制進行那些通過修改已映射位元組緩衝區
(通過調用
map
方法獲得)的內容所進行的更改。調用已映射位元組緩衝區的 force
方法將強行對要寫入緩衝區的內容進行更改。
metaData
- 如果為 true,則需要此方法強制對要寫入存儲設備的檔案內容和元資料進行更改;否則只需強行寫入內容更改
ClosedChannelException
- 如果此通道已關閉
IOException
- 如果發生其他 I/O 錯誤public abstract long transferTo(long position, long count, WritableByteChannel target) throws IOException
試圖讀取從此通道的檔案中給定 position 處開始的 count 個位元組,並將其寫入目標通道。此方法的調用不一定傳輸所有請求的位元組;是否傳輸取決於通道的性質和狀態。如果此通道的檔案從給定的 position 處開始所包含的位元組數小於 count 個位元組,或者如果目標通道是非阻塞的並且其輸出緩衝區中的自由空間少於 count 個位元組,則所傳輸的位元組數要小於請求的位元組數。
此方法不修改此通道的位置。如果給定的位置大於該檔案的當前大小,則不傳輸任何位元組。如果目標通道中有該位置,則從該位置開始寫入各位元組,然後將該位置增加寫入的位元組數。
與從此通道讀取並將內容寫入目標通道的簡單循環語句相比,此方法可能高效得多。很多作業系統可將位元組直接從檔案系統快取記憶體傳輸到目標通道,而無需實際複製各位元組。
position
- 檔案中的位置,從此位置開始傳輸;必須為非負數count
- 要傳輸的最大位元組數;必須為非負數target
- 目標通道
IllegalArgumentException
- 如果關於參數的前提不成立
NonReadableChannelException
- 如果不允許從此通道進行讀取操作
NonWritableChannelException
- 如果目標通道不允許進行寫入操作
ClosedChannelException
- 如果此通道或目標通道已關閉
AsynchronousCloseException
- 如果正在進行傳輸時另一個執行緒關閉了任一通道
ClosedByInterruptException
- 如果正在進行傳輸時另一個執行緒中斷了當前執行緒,因此關閉了兩個通道並將當前執行緒設置為中斷
IOException
- 如果發生其他 I/O 錯誤public abstract long transferFrom(ReadableByteChannel src, long position, long count) throws IOException
試著從源通道中最多讀取 count 個位元組,並將其寫入到此通道的檔案中從給定 position 處開始的位置。此方法的調用不一定傳輸所有請求的位元組;是否傳輸取決於通道的性質和狀態。如果源通道的剩餘空間小於 count 個位元組,或者如果源通道是非阻塞的並且其輸入緩衝區中直接可用的空間小於 count 個位元組,則所傳輸的位元組數要小於請求的位元組數。
此方法不修改此通道的位置。如果給定的位置大於該檔案的當前大小,則不傳輸任何位元組。如果該位置在源通道中,則從該位置開始讀取各位元組,然後將該位置增加讀取的位元組數。
與從源通道讀取並將內容寫入此通道的簡單循環語句相比,此方法可能高效得多。很多作業系統可將位元組直接從源通道傳輸到檔案系統快取記憶體,而無需實際複製各位元組。
src
- 源通道position
- 檔案中的位置,從此位置開始傳輸;必須為非負數count
- 要傳輸的最大位元組數;必須為非負數
IllegalArgumentException
- 如果關於參數的前提不成立
NonReadableChannelException
- 如果不允許從源通道進行讀取操作
NonWritableChannelException
- 如果不允許對此通道進行寫入操作
ClosedChannelException
- 如果此通道或源通道已關閉
AsynchronousCloseException
- 如果正在進行傳輸時另一個執行緒關閉了任一通道
ClosedByInterruptException
- 如果正在進行傳輸時另一個執行緒中斷了當前執行緒,因此關閉了兩個通道並將當前執行緒設置為中斷
IOException
- 如果發生其他 I/O 錯誤public abstract int read(ByteBuffer dst, long position) throws IOException
除了從給定的檔案位置開始讀取各位元組,而不是從該通道的當前位置外,此方法的執行方式與 read(ByteBuffer)
方法相同。此方法不修改此通道的位置。如果給定的位置大於該檔案的當前大小,則不讀取任何位元組。
dst
- 要向其中傳輸位元組的緩衝區position
- 開始傳輸的檔案位置;必須為非負數
IllegalArgumentException
- 如果 position 為負
NonReadableChannelException
- 如果不允許從此通道進行讀取操作
ClosedChannelException
- 如果此通道已關閉
AsynchronousCloseException
- 如果正在進行讀取操作時另一個執行緒關閉了此通道
ClosedByInterruptException
- 如果正在進行讀取操作時另一個執行緒中斷了當前執行緒,因此關閉了該通道並將當前執行緒設置為中斷狀態
IOException
- 如果發生其他 I/O 錯誤public abstract int write(ByteBuffer src, long position) throws IOException
除了從給定的檔案位置開始寫入各位元組,而不是從該通道的當前位置外,此方法的執行方式與 write(ByteBuffer)
方法相同。此方法不修改此通道的位置。如果給定的位置大於該檔案的當前大小,則該檔案將擴大以容納新的位元組;在以前檔案末尾和新寫入位元組之間的位元組值是未指定的。
src
- 要傳輸其中位元組的緩衝區position
- 開始傳輸的檔案位置;必須為非負數
IllegalArgumentException
- 如果 position 為負
NonWritableChannelException
- 如果不允許對此通道進行寫入操作
ClosedChannelException
- 如果此通道已關閉
AsynchronousCloseException
- 如果正在進行寫入操作時另一個執行緒關閉了此通道
ClosedByInterruptException
- 如果正在進行寫入操作時另一個執行緒中斷了當前執行緒,因此關閉了該通道並將當前執行緒的狀態設置為中斷
IOException
- 如果發生其他 I/O 錯誤public abstract MappedByteBuffer map(FileChannel.MapMode mode, long position, long size) throws IOException
可以通過下列三種網要將檔案區域映射到記憶體中:
只讀: 試圖修改得到的緩衝區將導致拋出 ReadOnlyBufferException
。(MapMode.READ_ONLY
)
讀/寫: 對得到的緩衝區的更改最終將傳播到檔案;該更改對映射到同一檔案的其他程序不一定是可見的。 (MapMode.READ_WRITE
)
專用: 對得到的緩衝區的更改不會傳播到檔案,並且該更改對映射到同一檔案的其他程序也不是可見的;相反,會創建緩衝區已修改部分的專用副本。 (MapMode.PRIVATE
)
對於只讀映射關係,此通道必須可以進行讀取操作;對於讀取/寫入或專用映射關係,此通道必須可以進行讀取和寫入操作。
此方法返回的已映射位元組緩衝區
具有的位置為零,限制和容量為 size;其標記是不確定的。在緩衝區本身被作為垃圾回收之前,該緩衝區及其表示的映射關係都是有效的。
映射關係一經創建,就不再依賴於創建它時所用的檔案通道。特別是關閉該通道對映射關係的有效性沒有任何影響。
很多記憶體映射檔案的細節從根本上是取決於底層作業系統的,因此是未指定的。當所請求的區域沒有完全包含在此通道的檔案中時,此方法的行為是未指定的。未指定是否將此程序或另一個程序對底層檔案的內容或大小所進行的更改傳播到緩衝區。未指定將對緩衝區的更改傳播到檔案的頻率。
對於大多數作業系統而言,與通過普通的 read
和 write
方法讀取或寫入數千位元組的資料相比,將檔案映射到記憶體中開銷更大。從性能的觀點來看,通常將相對較大的檔案映射到記憶體中才是值得的。
mode
- 根據是按只讀、讀取/寫入或專用(寫入時拷貝)來映射檔案,分別為 FileChannel.MapMode
類別中所定義的 READ_ONLY
、READ_WRITE
或 PRIVATE
之一position
- 檔案中的位置,映射區域從此位置開始;必須為非負數size
- 要映射的區域大小;必須為非負數且不大於 Integer.MAX_VALUE
NonReadableChannelException
- 如果 mode 是 READ_ONLY
,但是不允許對此通道進行讀取操作
NonWritableChannelException
- 如果 mode 是 READ_WRITE
或 PRIVATE
,但是不允許此通道進行讀取和寫入操作
IllegalArgumentException
- 如果關於參數的前提不成立
IOException
- 如果發生其他 I/O 錯誤FileChannel.MapMode
,
MappedByteBuffer
public abstract FileLock lock(long position, long size, boolean shared) throws IOException
在可以鎖定該區域、已關閉此通道或者已中斷調用執行緒(以先到者為準)之前,將阻塞此方法的調用。
如果在此方法調用期間另一個執行緒關閉了此通道,則拋出 AsynchronousCloseException
。
如果在等待獲取鎖定的同時中斷了調用執行緒,則將狀態設置為中斷並拋出 FileLockInterruptionException
。如果調用此方法時已設置調用方的中斷狀態,則立即拋出該異常;不更改該執行緒的中斷狀態。
由 position 和 size 參數所指定的區域無需包含在實際的底層檔案中,甚至無需與檔案重疊。鎖定區域的大小是固定的;如果某個已鎖定區域最初包含整個檔案,並且檔案因擴大而超出了該區域,則該鎖定不覆寫此檔案的新部分。如果期望檔案大小擴大並且要求鎖定整個檔案,則應該鎖定從零開始,到不小於期望最大檔案大小的區域。零參數的 lock()
方法只是鎖定大小為 Long.MAX_VALUE
的區域。
某些作業系統不支持共享鎖定,在這種情況下,自動將對共享鎖定的請求轉換為對獨佔鎖定的請求。可通過調用所得鎖定物件的 isShared
方法來測試新獲取的鎖定是共享的還是獨佔的。
檔案鎖定是以整個 Java 虛擬機器來保持的。但它們不適用於控制同一虛擬機器內多個執行緒對檔案的存取。
position
- 鎖定區域開始的位置;必須為非負數size
- 鎖定區域的大小;必須為非負數,並且 position + size 的和必須為非負數shared
- 要請求共享鎖定,則為 true,在這種情況下此通道必須允許進行讀取(可能是寫入)操作;要請求獨佔鎖定,則為 false,在這種情況下此通道必須允許進行寫入(可能是讀取)操作
IllegalArgumentException
- 如果關於參數的前提不成立
ClosedChannelException
- 如果此通道已關閉
AsynchronousCloseException
- 如果調用執行緒阻塞於此方法中時另一個執行緒關閉了此通道
FileLockInterruptionException
- 如果調用執行緒阻塞於此方法中時被中斷
OverlappingFileLockException
- 如果此 Java 虛擬機器已經持有與所請求區域重疊的鎖定,或者如果另一個執行緒已阻塞於此方法中並且正在試圖鎖定一個重疊區域
NonReadableChannelException
- 如果 shared 為 true,但此通道不允許進行讀取操作
NonWritableChannelException
- 如果 shared 為 false,但此通道不允許進行寫入操作
IOException
- 如果發生其他 I/O 錯誤lock()
,
tryLock()
,
tryLock(long,long,boolean)
public final FileLock lock() throws IOException
調用此方法的形式為 fc.lock(), 該調用與以下調用完全相同:
fc.lock
(0L, Long.MAX_VALUE, false)
ClosedChannelException
- 如果此通道已關閉
AsynchronousCloseException
- 如果調用執行緒阻塞於此方法中時另一個執行緒關閉了此通道
FileLockInterruptionException
- 如果調用執行緒阻塞於此方法中時被中斷
OverlappingFileLockException
- 如果此 Java 虛擬機器已經持有與所請求區域重疊的鎖定,或者如果另一個執行緒已阻塞在此方法中並且正在試圖鎖定同一檔案的重疊區域
NonWritableChannelException
- 如果沒有為寫入打開此通道
IOException
- 如果發生其他 I/O 錯誤lock(long,long,boolean)
,
tryLock()
,
tryLock(long,long,boolean)
public abstract FileLock tryLock(long position, long size, boolean shared) throws IOException
此方法不會阻塞。無論是否已成功地獲得請求區域上的鎖定,調用總是立即返回。如果由於另一個程序保持著一個重疊鎖定而無法獲取鎖定,則此方法返回 null。如果由於任何其他原因而無法獲取鎖定,則拋出相應的異常。
由 position 和 size 參數所指定的區域無需包含在實際的底層檔案中,甚至無需與檔案重疊。鎖定區域的大小是固定的;如果某個已鎖定區域最初包含整個檔案,但檔案因擴大而超出了該區域,則該鎖定不覆寫此檔案的新部分。如果期望檔案大小擴大並且要求鎖定整個檔案,則應該鎖定從零開始,到不小於期望最大檔案大小為止的區域。零參數的 tryLock()
方法只是鎖定大小為 Long.MAX_VALUE
的區域。
某些作業系統不支持共享鎖定,在這種情況下,自動將對共享鎖定的請求轉換為對獨佔鎖定的請求。可通過調用所得鎖定物件的 isShared
方法來測試新獲取的鎖定是共享的還是獨佔的。
檔案鎖定以整個 Java 虛擬機器來保持。但它們不適用於控制同一虛擬機器內多個執行緒對檔案的存取。
position
- 鎖定區域開始的位置;必須為非負數size
- 鎖定區域的大小;必須為非負數,並且 position + size 的和必須為非負數shared
- 要請求共享鎖定,則為 true,要請求獨佔鎖定,則為 false
IllegalArgumentException
- 如果關於參數的前提不成立
ClosedChannelException
- 如果此通道已關閉
OverlappingFileLockException
- 如果此 Java 虛擬機器已經持有與所請求區域重疊的鎖定,或者如果另一個執行緒已阻塞在此方法中並且正在試圖鎖定同一檔案的重疊區域
IOException
- 如果發生其他 I/O 錯誤lock()
,
lock(long,long,boolean)
,
tryLock()
public final FileLock tryLock() throws IOException
調用此方法的形式為 fc.tryLock(), 該調用與以下調用完全相同:
fc.tryLock
(0L, Long.MAX_VALUE, false)
ClosedChannelException
- 如果此通道已關閉
OverlappingFileLockException
- 如果此 Java 虛擬機器已經持有與所請求區域重疊的鎖定,或者如果另一個執行緒已阻塞於此方法中並且正在試圖鎖定一個重疊區域
IOException
- 如果發生其他 I/O 錯誤lock()
,
lock(long,long,boolean)
,
tryLock(long,long,boolean)
|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only。