JavaTM 2 Platform
Standard Ed. 6

java.nio.channels
類別 FileChannel

java.lang.Object
  繼承者 java.nio.channels.spi.AbstractInterruptibleChannel
      繼承者 java.nio.channels.FileChannel
所有已實作的介面:
Closeable, ByteChannel, Channel, GatheringByteChannel, InterruptibleChannel, ReadableByteChannel, ScatteringByteChannel, WritableByteChannel

public abstract class FileChannel
extends AbstractInterruptibleChannel
implements ByteChannel, GatheringByteChannel, ScatteringByteChannel

用於讀取、寫入、映射和操作檔案的通道。

檔案通道在其檔案中有一個當前 position,可對其進行查詢修改。該檔案本身包含一個可讀寫的長度可變的位元組序列,並且可以查詢該檔案的當前大小。寫入的位元組超出檔案的當前大小時,則增加檔案的大小;截取 該檔案時,則減小檔案的大小。檔案可能還有某個相關聯的元資料,如存取權限、內容型別和最後的修改時間;此類別未定義存取元資料的方法。

除了位元組通道中常見的讀取、寫入和關閉操作外,此類別還定義了下列特定於檔案的操作:

多個共時執行緒可安全地使用檔案通道。可隨時調用關閉方法,正如 Channel 介面中所指定的。對於涉及通道位置或者可以更改其檔案大小的操作,在任意給定時間只能進行一個這樣的操作;如果嘗試在第一個操作仍在進行時發起第二個操作,則會導致在第一個操作完成之前阻塞第二個操作。可以共時處理其他操作,特別是那些採用顯式位置的操作;但是否共時處理則取決於基礎實作,因此是未指定的。

確保此類別的實例所提供的檔案視圖與同一程序中其他實例所提供的相同檔案視圖是一致的。但是,此類別的實例所提供的視圖不一定與其他共時運行的程序所看到的視圖一致,這取決於底層作業系統所執行的緩衝策略和各種網路檔案系統協議所引入的延遲。不管其他程序是以何種語言編寫的,而且也不管是運行在相同機器還是不同機器上都是如此。此種不一致的確切性質取決於系統,因此是未指定的。

此類別沒有定義打開現有檔案或創建新檔案的方法,以後的版本中可能添加這些方法。在此版本中,可從現有的 FileInputStreamFileOutputStreamRandomAccessFile 物件獲得檔案通道,方法是調用該物件的 getChannel 方法,這會返回一個連接到相同底層檔案的檔案通道。

檔案通道的狀態與其 getChannel 返回該通道的物件密切相關。顯式或者通過讀取或寫入位元組來更改通道的位置將更改發起物件的檔案位置,反之亦然。通過檔案通道更改此檔案的長度將更改通過發起物件看到的長度,反之亦然。通過寫入位元組更改此檔案的內容將更改發起物件所看到的內容,反之亦然。

此類別在各種情況下指定要求“允許讀取操作”、“允許寫入操作”或“允許讀取和寫入操作”的某個實例。通過 FileInputStream 實例的 getChannel 方法所獲得的通道將允許進行讀取操作。通過 FileOutputStream 實例的 getChannel 方法所獲得的通道將允許進行寫入操作。最後,如果使用網要 "r" 創建 RandomAccessFile 實例,則通過該實例的 getChannel 方法所獲得的通道將允許進行讀取操作,如果使用網要 "rw" 創建實例,則獲得的通道將允許進行讀取和寫入操作。

如果從檔案輸出串流中獲得了允許進行寫入操作的檔案通道,並且該輸出串流是通過調用 FileOutputStream(File,boolean) 建構子且為第二個參數傳入 true 來創建的,則該檔案通道可能處於添加網要。在此網要中,每次調用相關的寫入操作都會首先將位置移到檔案的末尾,然後再寫入請求的資料。在單個原子操作中是否移動位置和寫入資料是與系統相關的,因此是未指定的。

從以下版本開始:
1.4
另請參見:
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
 

建構子詳細資訊

FileChannel

protected FileChannel()
初始化此類別的一個新實例。

方法詳細資訊

read

public abstract int read(ByteBuffer dst)
                  throws IOException
將位元組序列從此通道讀入給定的緩衝區。

從此通道的當前檔案位置開始讀取位元組,然後使用實際讀取的位元組數更新該檔案位置。否則此方法的行為與 ReadableByteChannel 介面中指定的行為完全相同。

指定者:
介面 ReadableByteChannel 中的 read
參數:
dst - 要向其中傳輸位元組的緩衝區
返回:
讀取的位元組數,可能為零,如果該通道已到達串流的末尾,則返回 -1
拋出:
ClosedChannelException - 如果此通道已關閉
AsynchronousCloseException - 如果正在進行讀取操作時另一個執行緒關閉了此通道
ClosedByInterruptException - 如果正在進行讀取操作時另一個執行緒中斷了當前執行緒,因此關閉了該通道並將當前執行緒設置為中斷狀態
IOException - 如果發生其他 I/O 錯誤

read

public abstract long read(ByteBuffer[] dsts,
                          int offset,
                          int length)
                   throws IOException
將位元組序列從此通道讀入給定緩衝區的子序列中。

從此通道的當前檔案位置開始讀取位元組,然後使用實際讀取的位元組數更新該檔案位置。否則此方法的行為與 ScatteringByteChannel 介面中指定的行為完全相同。

指定者:
介面 ScatteringByteChannel 中的 read
參數:
dsts - 要向其中傳輸位元組的緩衝區
offset - 第一個緩衝區(位元組傳輸到該緩衝區中)在緩衝區陣列中的偏移量;必須為非負數並且不能大於 dsts.length
length - 要存取的最大緩衝區數;必須為非負數並且不能大於 dsts.length - offset
返回:
讀取的位元組數,可能為零,如果該通道已到達串流的末尾,則返回 -1
拋出:
ClosedChannelException - 如果此通道已關閉
AsynchronousCloseException - 如果正在進行讀取操作時另一個執行緒關閉了此通道
ClosedByInterruptException - 如果正在進行讀取操作時另一個執行緒中斷了當前執行緒,因此關閉了該通道並將當前執行緒設置為中斷狀態
IOException - 如果發生其他 I/O 錯誤

read

public final long read(ByteBuffer[] dsts)
                throws IOException
將位元組序列從此通道讀入給定的緩衝區。

從此通道的當前檔案位置開始讀取位元組,然後使用實際讀取的位元組數更新該檔案位置。否則此方法的行為與 ScatteringByteChannel 介面中指定的行為完全相同。

指定者:
介面 ScatteringByteChannel 中的 read
參數:
dsts - 要向其中傳輸位元組的緩衝區
返回:
讀取的位元組數,可能為零,如果該通道已到達串流的末尾,則返回 -1
拋出:
ClosedChannelException - 如果此通道已關閉
AsynchronousCloseException - 如果正在進行讀取操作時另一個執行緒關閉了此通道
ClosedByInterruptException - 如果正在進行讀取操作時另一個執行緒中斷了當前執行緒,因此關閉了該通道並將當前執行緒設置為中斷狀態
IOException - 如果發生其他 I/O 錯誤

write

public abstract int write(ByteBuffer src)
                   throws IOException
將位元組序列從給定的緩衝區寫入此通道。

從此通道的當前檔案位置開始寫入位元組,但是如果該通道處於添加網要,則首先將該位置移到檔案的末尾。如有必要,可以擴大檔案以容納寫入的位元組,然後使用實際寫入的位元組數更新該檔案位置。否則此方法的行為與 WritableByteChannel 介面所指定的行為完全相同。

指定者:
介面 WritableByteChannel 中的 write
參數:
src - 要從中獲取位元組的緩衝區
返回:
寫入的位元組數,可能為零
拋出:
ClosedChannelException - 如果此通道已關閉
AsynchronousCloseException - 如果正在進行寫入操作時另一個執行緒關閉了此通道
ClosedByInterruptException - 如果正在進行寫入操作時另一個執行緒中斷了當前執行緒,因此關閉了該通道並將當前執行緒的狀態設置為中斷
IOException - 如果發生其他 I/O 錯誤

write

public abstract long write(ByteBuffer[] srcs,
                           int offset,
                           int length)
                    throws IOException
將位元組序列從給定緩衝區的子序列寫入此通道。

從此通道的當前檔案位置開始寫入位元組,但是如果該通道處於添加網要,則首先將位置移到檔案的末尾。如有必要,可以擴大檔案以容納寫入的位元組,然後使用實際寫入的位元組數更新該檔案位置。否則此方法的行為與 GatheringByteChannel 介面中指定的行為完全相同。

指定者:
介面 GatheringByteChannel 中的 write
offset - 第一個緩衝區(要獲取該緩衝區中的位元組)在緩衝區陣列中的偏移量;必須為非負數並且不能大於 srcs.length
length - 要存取的最大緩衝區數;必須為非負數並且不能大於 srcs.length - offset
返回:
寫入的位元組數,可能為零
拋出:
ClosedChannelException - 如果此通道已關閉
AsynchronousCloseException - 如果正在進行寫入操作時另一個執行緒關閉了此通道
ClosedByInterruptException - 如果正在進行寫入操作時另一個執行緒中斷了當前執行緒,因此關閉了該通道並將當前執行緒的狀態設置為中斷
IOException - 如果發生其他 I/O 錯誤

write

public final long write(ByteBuffer[] srcs)
                 throws IOException
將位元組序列從給定的緩衝區寫入此通道。

從此通道的當前檔案位置開始寫入位元組,但是如果該通道處於添加網要,則首先將位置移到檔案的末尾。如有必要,可以擴大檔案以容納寫入的位元組,然後使用實際寫入的位元組數更新該檔案位置。否則此方法的行為與 GatheringByteChannel 介面中指定的行為完全相同。

指定者:
介面 GatheringByteChannel 中的 write
返回:
寫入的位元組數,可能為零
拋出:
ClosedChannelException - 如果此通道已關閉
AsynchronousCloseException - 如果正在進行寫入操作時另一個執行緒關閉了此通道
ClosedByInterruptException - 如果正在進行寫入操作時另一個執行緒中斷了當前執行緒,因此關閉了該通道並將當前執行緒的狀態設置為中斷
IOException - 如果發生其他 I/O 錯誤

position

public abstract long position()
                       throws IOException
返回此通道的檔案位置。

返回:
此通道的檔案位置,這是一個非負整數,它計算從檔案的開始到當前位置之間的位元組數
拋出:
ClosedChannelException - 如果此通道已關閉
IOException - 如果發生其他 I/O 錯誤

position

public abstract FileChannel position(long newPosition)
                              throws IOException
設置此通道的檔案位置。

將該位置設置為大於檔案當前大小的值是合法的,但這不會更改檔案的大小。稍後試圖在這樣的位置讀取位元組將立即返回已到達檔案末尾的指示。稍後試圖在這種位置寫入位元組將導致檔案擴大,以容納新的位元組;在以前檔案末尾和新寫入位元組之間的位元組值是未指定的。

參數:
newPosition - 新位置,這是一個非負整數,它計算從檔案開始的位元組數
返回:
此檔案通道
拋出:
ClosedChannelException - 如果此通道已關閉
IllegalArgumentException - 如果 newPosition 為負
IOException - 如果發生其他 I/O 錯誤

size

public abstract long size()
                   throws IOException
返回此通道的檔案的當前大小。

返回:
此通道的檔案的當前大小,以位元組為單位
拋出:
ClosedChannelException - 如果此通道已關閉
IOException - 如果發生其他 I/O 錯誤

truncate

public abstract FileChannel truncate(long size)
                              throws IOException
將此通道的檔案截取為給定大小。

如果給定大小小於該檔案的當前大小,則截取該檔案,丟棄檔案新末尾後面的所有位元組。如果給定大小大於等於該檔案的當前大小,則不修改檔案。無論是哪種情況,如果此通道的檔案位置大於給定大小,則將位置設置為該大小。

參數:
size - 新的大小,非負的位元組計數
返回:
此檔案通道
拋出:
NonWritableChannelException - 如果不允許對此通道進行寫入操作
ClosedChannelException - 如果此通道已關閉
IllegalArgumentException - 如果新的 size 為負
IOException - 如果發生其他 I/O 錯誤

force

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 錯誤

transferTo

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 錯誤

transferFrom

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 錯誤

read

public abstract int read(ByteBuffer dst,
                         long position)
                  throws IOException
從給定的檔案位置開始,從此通道讀取位元組序列,並寫入給定的緩衝區。

除了從給定的檔案位置開始讀取各位元組,而不是從該通道的當前位置外,此方法的執行方式與 read(ByteBuffer) 方法相同。此方法不修改此通道的位置。如果給定的位置大於該檔案的當前大小,則不讀取任何位元組。

參數:
dst - 要向其中傳輸位元組的緩衝區
position - 開始傳輸的檔案位置;必須為非負數
返回:
讀取的位元組數,可能為零,如果給定的位置大於等於該檔案的當前大小,則返回 -1
拋出:
IllegalArgumentException - 如果 position 為負
NonReadableChannelException - 如果不允許從此通道進行讀取操作
ClosedChannelException - 如果此通道已關閉
AsynchronousCloseException - 如果正在進行讀取操作時另一個執行緒關閉了此通道
ClosedByInterruptException - 如果正在進行讀取操作時另一個執行緒中斷了當前執行緒,因此關閉了該通道並將當前執行緒設置為中斷狀態
IOException - 如果發生其他 I/O 錯誤

write

public abstract int write(ByteBuffer src,
                          long position)
                   throws IOException
從給定的檔案位置開始,將位元組序列從給定緩衝區寫入此通道。

除了從給定的檔案位置開始寫入各位元組,而不是從該通道的當前位置外,此方法的執行方式與 write(ByteBuffer) 方法相同。此方法不修改此通道的位置。如果給定的位置大於該檔案的當前大小,則該檔案將擴大以容納新的位元組;在以前檔案末尾和新寫入位元組之間的位元組值是未指定的。

參數:
src - 要傳輸其中位元組的緩衝區
position - 開始傳輸的檔案位置;必須為非負數
返回:
寫入的位元組數,可能為零
拋出:
IllegalArgumentException - 如果 position 為負
NonWritableChannelException - 如果不允許對此通道進行寫入操作
ClosedChannelException - 如果此通道已關閉
AsynchronousCloseException - 如果正在進行寫入操作時另一個執行緒關閉了此通道
ClosedByInterruptException - 如果正在進行寫入操作時另一個執行緒中斷了當前執行緒,因此關閉了該通道並將當前執行緒的狀態設置為中斷
IOException - 如果發生其他 I/O 錯誤

map

public abstract MappedByteBuffer map(FileChannel.MapMode mode,
                                     long position,
                                     long size)
                              throws IOException
將此通道的檔案區域直接映射到記憶體中。

可以通過下列三種網要將檔案區域映射到記憶體中:

對於只讀映射關係,此通道必須可以進行讀取操作;對於讀取/寫入或專用映射關係,此通道必須可以進行讀取和寫入操作。

此方法返回的已映射位元組緩衝區具有的位置為零,限制和容量為 size;其標記是不確定的。在緩衝區本身被作為垃圾回收之前,該緩衝區及其表示的映射關係都是有效的。

映射關係一經創建,就不再依賴於創建它時所用的檔案通道。特別是關閉該通道對映射關係的有效性沒有任何影響。

很多記憶體映射檔案的細節從根本上是取決於底層作業系統的,因此是未指定的。當所請求的區域沒有完全包含在此通道的檔案中時,此方法的行為是未指定的。未指定是否將此程序或另一個程序對底層檔案的內容或大小所進行的更改傳播到緩衝區。未指定將對緩衝區的更改傳播到檔案的頻率。

對於大多數作業系統而言,與通過普通的 readwrite 方法讀取或寫入數千位元組的資料相比,將檔案映射到記憶體中開銷更大。從性能的觀點來看,通常將相對較大的檔案映射到記憶體中才是值得的。

參數:
mode - 根據是按只讀、讀取/寫入或專用(寫入時拷貝)來映射檔案,分別為 FileChannel.MapMode 類別中所定義的 READ_ONLYREAD_WRITEPRIVATE 之一
position - 檔案中的位置,映射區域從此位置開始;必須為非負數
size - 要映射的區域大小;必須為非負數且不大於 Integer.MAX_VALUE
拋出:
NonReadableChannelException - 如果 modeREAD_ONLY,但是不允許對此通道進行讀取操作
NonWritableChannelException - 如果 modeREAD_WRITEPRIVATE,但是不允許此通道進行讀取和寫入操作
IllegalArgumentException - 如果關於參數的前提不成立
IOException - 如果發生其他 I/O 錯誤
另請參見:
FileChannel.MapMode, MappedByteBuffer

lock

public abstract FileLock lock(long position,
                              long size,
                              boolean shared)
                       throws IOException
獲取此通道的檔案給定區域上的鎖定。

在可以鎖定該區域、已關閉此通道或者已中斷調用執行緒(以先到者為準)之前,將阻塞此方法的調用。

如果在此方法調用期間另一個執行緒關閉了此通道,則拋出 AsynchronousCloseException

如果在等待獲取鎖定的同時中斷了調用執行緒,則將狀態設置為中斷並拋出 FileLockInterruptionException。如果調用此方法時已設置調用方的中斷狀態,則立即拋出該異常;不更改該執行緒的中斷狀態。

positionsize 參數所指定的區域無需包含在實際的底層檔案中,甚至無需與檔案重疊。鎖定區域的大小是固定的;如果某個已鎖定區域最初包含整個檔案,並且檔案因擴大而超出了該區域,則該鎖定不覆寫此檔案的新部分。如果期望檔案大小擴大並且要求鎖定整個檔案,則應該鎖定從零開始,到不小於期望最大檔案大小的區域。零參數的 lock() 方法只是鎖定大小為 Long.MAX_VALUE 的區域。

某些作業系統不支持共享鎖定,在這種情況下,自動將對共享鎖定的請求轉換為對獨佔鎖定的請求。可通過調用所得鎖定物件的 isShared 方法來測試新獲取的鎖定是共享的還是獨佔的。

檔案鎖定是以整個 Java 虛擬機器來保持的。但它們不適用於控制同一虛擬機器內多個執行緒對檔案的存取。

參數:
position - 鎖定區域開始的位置;必須為非負數
size - 鎖定區域的大小;必須為非負數,並且 position + size 的和必須為非負數
shared - 要請求共享鎖定,則為 true,在這種情況下此通道必須允許進行讀取(可能是寫入)操作;要請求獨佔鎖定,則為 false,在這種情況下此通道必須允許進行寫入(可能是讀取)操作
返回:
一個鎖定物件,表示新獲取的鎖定
拋出:
IllegalArgumentException - 如果關於參數的前提不成立
ClosedChannelException - 如果此通道已關閉
AsynchronousCloseException - 如果調用執行緒阻塞於此方法中時另一個執行緒關閉了此通道
FileLockInterruptionException - 如果調用執行緒阻塞於此方法中時被中斷
OverlappingFileLockException - 如果此 Java 虛擬機器已經持有與所請求區域重疊的鎖定,或者如果另一個執行緒已阻塞於此方法中並且正在試圖鎖定一個重疊區域
NonReadableChannelException - 如果 sharedtrue,但此通道不允許進行讀取操作
NonWritableChannelException - 如果 sharedfalse,但此通道不允許進行寫入操作
IOException - 如果發生其他 I/O 錯誤
另請參見:
lock(), tryLock(), tryLock(long,long,boolean)

lock

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)

tryLock

public abstract FileLock tryLock(long position,
                                 long size,
                                 boolean shared)
                          throws IOException
試圖獲取對此通道的檔案給定區域的鎖定。

此方法不會阻塞。無論是否已成功地獲得請求區域上的鎖定,調用總是立即返回。如果由於另一個程序保持著一個重疊鎖定而無法獲取鎖定,則此方法返回 null。如果由於任何其他原因而無法獲取鎖定,則拋出相應的異常。

positionsize 參數所指定的區域無需包含在實際的底層檔案中,甚至無需與檔案重疊。鎖定區域的大小是固定的;如果某個已鎖定區域最初包含整個檔案,但檔案因擴大而超出了該區域,則該鎖定不覆寫此檔案的新部分。如果期望檔案大小擴大並且要求鎖定整個檔案,則應該鎖定從零開始,到不小於期望最大檔案大小為止的區域。零參數的 tryLock() 方法只是鎖定大小為 Long.MAX_VALUE 的區域。

某些作業系統不支持共享鎖定,在這種情況下,自動將對共享鎖定的請求轉換為對獨佔鎖定的請求。可通過調用所得鎖定物件的 isShared 方法來測試新獲取的鎖定是共享的還是獨佔的。

檔案鎖定以整個 Java 虛擬機器來保持。但它們不適用於控制同一虛擬機器內多個執行緒對檔案的存取。

參數:
position - 鎖定區域開始的位置;必須為非負數
size - 鎖定區域的大小;必須為非負數,並且 position + size 的和必須為非負數
shared - 要請求共享鎖定,則為 true,要請求獨佔鎖定,則為 false
返回:
一個鎖定物件,表示新獲取的鎖定,如果由於另一個程序保持著一個重疊鎖定而無法獲取鎖定,則返回 null
拋出:
IllegalArgumentException - 如果關於參數的前提不成立
ClosedChannelException - 如果此通道已關閉
OverlappingFileLockException - 如果此 Java 虛擬機器已經持有與所請求區域重疊的鎖定,或者如果另一個執行緒已阻塞在此方法中並且正在試圖鎖定同一檔案的重疊區域
IOException - 如果發生其他 I/O 錯誤
另請參見:
lock(), lock(long,long,boolean), tryLock()

tryLock

public final FileLock tryLock()
                       throws IOException
試圖獲取對此通道的檔案的獨佔鎖定。

調用此方法的形式為 fc.tryLock(), 該調用與以下調用完全相同:

     fc.tryLock(0L, Long.MAX_VALUE, false) 

返回:
一個鎖定物件,表示新獲取的鎖定,如果由於另一個程序保持著一個重疊鎖定而無法獲取鎖定,則返回 null
拋出:
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