|
JavaTM Platform Standard Ed. 6 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
java.lang.Object java.nio.channels.spi.AbstractInterruptibleChannel java.nio.channels.FileChannel
public abstract class FileChannel
ファイルの読み込み、書き込み、マッピング、操作用チャネルです。
ファイルチャネルは、ファイル内に、
および 照会
が可能な現在の「位置」を持っています。ファイル自体には、読み込み/書き込みと現在の 変更
サイズ
の照会が可能な可変長のバイトシーケンスが含まれています。ファイルのサイズは、現在のサイズを上回るバイト数が書き込まれると大きくなり、切捨て
によって小さくなります。ファイルには、アクセス許可、コンテンツタイプ、最終更新時刻などの「メタデータ」も関連付けられています。このクラスは、メタデータアクセスのためのメソッドは定義しません。
このクラスは、バイトチャネルに対する一般的な操作 (読み込み、書き込み、クローズ) のほかに、次のようなファイル固有の操作を定義します。
ファイルの領域はメモリーに直接マッピング
される。ファイルのサイズが大きい場合は、通常の read メソッドや write メソッドを呼び出すより、この方法のほうが効率的
ファイルの更新は、基礎となっている記憶装置に強制書き出し
される。したがって、システムがクラッシュしてもデータの損失は回避される
バイトはファイルからほかのチャネルへ
転送できる。反対に、ほかのチャネルから
転送することもできる。多くのオペレーティングシステムでは、ファイルシステムのキャッシュとの間で非常に高速で直接送受信することにより、この転送を最適化できる
ファイルの領域は、その他のプログラムからアクセスできないようにロック
できる
ファイルチャネルは、複数の並行スレッドで安全に使用できます。close
メソッドは、Channel
インタフェースの指定どおり、いつでも呼び出すことができます。チャネルの位置を使用する操作、またはファイルサイズを変更する可能性がある操作は、1 つずつ実行することになっています。前の操作の進行中に同じような操作を新しく開始しようとすると、最初の操作が終わるまで新しい操作はブロックされます。その他の操作、とりわけ明示的な位置を使用する操作は、前の操作と同時並行で実行できます。同時並行処理が行われるかどうかは基礎となる実装によって決まるため、未指定です。
このクラスのインスタンスによって提供されたファイルのビューは、同じプログラム内のその他のインスタンスによって提供された同じファイルのビューと矛盾しないことが保証されています。しかし、基礎となるオペレーティングシステムのキャッシュ処理や、ネットワークファイルシステムプロトコルによる遅延が原因で、このクラスのインスタンスによって提供されたビューと、並行して実行されているプログラムで認識されるその他のビューが矛盾する可能性がないわけではありません。この問題は、これらのプログラムを記述している言語の違いや、これらが同一マシンで実行されているかどうかとは関係なく発生します。こうした矛盾は、システムによって生じるものであるため未指定です。
このクラスは、既存のファイルを開くメソッドや新しいファイルを作成するメソッドは定義しません。こうしたメソッドは、将来のリリースで追加される可能性があります。このたびのリリースでファイルチャネルを取得したい場合は、既存の FileInputStream
、FileOutputStream
、RandomAccessFile
のいずれかのオブジェクトの getChannel メソッドを呼び出します。こうすることにより、基礎にある同じファイルに接続されたファイルチャネルが返されます。
ファイルチャネルの状態は、チャネルを返した getChannel メソッドを持つオブジェクトの状態と密接な関係にあります。たとえば、チャネルの位置を明示的に、あるいはバイトの読み込みや書き込みによって変更すると、発生元のオブジェクトのファイル位置が変わります (逆も同様)。ファイルチャネルからファイルの長さを変更すると、発生元オブジェクトから見たときの長さが変わります (逆も同様)。バイトの書き込みによってファイルのコンテンツを変更すると、元のオブジェクトから見たときのコンテンツが変わります (逆も同様)。
このクラスは、さまざまな点で、「読み込み可能」、「書き込み可能」、または「読み込みと書き込みが可能」であるインスタンスが必要なことを指定しています。 たとえば、
FileInputStream
インスタンスの getChannel
メソッドで取得したチャネルは読み込み可能です。FileOutputStream
インスタンスの getChannel
メソッドで取得したチャネルは書き込み可能です。そして、RandomAccessFile
インスタンスの getChannel
メソッドで取得したチャネルは、インスタンスがモード「r」で作成された場合は読み込み可能、モード「rw」で作成された場合は読み込みと書き込みが可能です。
FileOutputStream(File,boolean)
コンストラクタを呼び出して 2 番目のパラメータに 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
- その他の入出力エラーが発生した場合public abstract long read(ByteBuffer[] dsts, int offset, int length) throws IOException
バイトの読み込みは、このチャネルの現在のファイル位置から開始されます。 その後、実際に読み込まれたバイト数によりファイル位置が更新されます。それ以外の場合、このメソッドは ScatteringByteChannel
インタフェースの指定どおりに動作します。
ScatteringByteChannel
内の read
dsts
- バイトの転送先バッファーoffset
- 最初のバイトの転送先となるバッファー配列内のオフセット。
dsts.length 以下の負でない値length
- アクセスされる最大バッファー数。
dsts.length - offset 以下の負でない値
ClosedChannelException
- このチャネルがクローズしている場合
AsynchronousCloseException
- 読み込み操作の進行中に、別のスレッドによってこのチャネルがクローズされた場合
ClosedByInterruptException
- 読み込み操作の進行中に別のスレッドからの割り込みがあったためにチャネルがクローズし、
現在のスレッドの割り込み状態が設定された場合
IOException
- その他の入出力エラーが発生した場合public final long read(ByteBuffer[] dsts) throws IOException
バイトの読み込みは、このチャネルの現在のファイル位置から開始されます。 その後、実際に読み込まれたバイト数によりファイル位置が更新されます。それ以外の場合、このメソッドは ScatteringByteChannel
インタフェースの指定どおりに動作します。
ScatteringByteChannel
内の read
dsts
- バイトの転送先バッファー
ClosedChannelException
- このチャネルがクローズしている場合
AsynchronousCloseException
- 読み込み操作の進行中に、別のスレッドによってこのチャネルがクローズされた場合
ClosedByInterruptException
- 読み込み操作の進行中に別のスレッドからの割り込みがあったためにチャネルがクローズし、
現在のスレッドの割り込み状態が設定された場合
IOException
- その他の入出力エラーが発生した場合public abstract int write(ByteBuffer src) throws IOException
チャネルが追加モード以外の場合、バイトの書き出しは、このチャネルの現在のファイル位置から開始されます。 追加モードでは、最初に、位置がファイルの末尾まで進みます。ファイルのサイズは、書き込まれたバイト数に合わせ、必要であれば大きくなります。 ファイル位置は、実際に書き込まれたバイト数によって更新されます。それ以外の点で、このメソッドは WritableByteChannel
インタフェースの指定どおりに動作します。
WritableByteChannel
内の write
src
- バイトの取得先バッファー
ClosedChannelException
- このチャネルがクローズしている場合
AsynchronousCloseException
- 書き込み中に別のスレッドによってこのチャネルがクローズされた場合
ClosedByInterruptException
- 書き込み中に別のスレッドからの割り込みがあったためにチャネルがクローズし、現在のスレッドの割り込み状態が設定された場合
IOException
- その他の入出力エラーが発生した場合public abstract long write(ByteBuffer[] srcs, int offset, int length) throws IOException
チャネルが追加モード以外の場合、バイトの書き出しは、このチャネルの現在のファイル位置から開始されます。 追加モードでは、最初に、位置がファイルの末尾まで進みます。ファイルのサイズは、書き込まれたバイト数に合わせ、必要であれば大きくなります。 ファイル位置は、実際に書き込まれたバイト数によって更新されます。それ以外の点で、このメソッドは GatheringByteChannel
インタフェースの指定どおりに動作します。
GatheringByteChannel
内の write
srcs
- バイトの取得先バッファーoffset
- 最初のバイトの取得先となるバッファー配列内のオフセット。srcs.length 以下の負でない値length
- アクセスされる最大バッファー数。
srcs.length - offset 以下の負でない値
ClosedChannelException
- このチャネルがクローズしている場合
AsynchronousCloseException
- 書き込み中に別のスレッドによってこのチャネルがクローズされた場合
ClosedByInterruptException
- 書き込み操作の進行中に別のスレッドからの割り込みがあったためにチャネルがクローズし、
現在のスレッドの割り込み状態が設定された場合
IOException
- その他の入出力エラーが発生した場合public final long write(ByteBuffer[] srcs) throws IOException
チャネルが追加モード以外の場合、バイトの書き出しは、このチャネルの現在のファイル位置から開始されます。 追加モードでは、最初に、位置がファイルの末尾まで進みます。ファイルのサイズは、書き込まれたバイト数に合わせ、必要であれば大きくなります。 ファイル位置は、実際に書き込まれたバイト数によって更新されます。それ以外の点で、このメソッドは GatheringByteChannel
インタフェースの指定どおりに動作します。
GatheringByteChannel
内の write
srcs
- バイトの取得先バッファー
ClosedChannelException
- このチャネルがクローズしている場合
AsynchronousCloseException
- 書き込み中に別のスレッドによってこのチャネルがクローズされた場合
ClosedByInterruptException
- 書き込み操作の進行中に別のスレッドからの割り込みがあったためにチャネルがクローズし、
現在のスレッドの割り込み状態が設定された場合
IOException
- その他の入出力エラーが発生した場合public abstract long position() throws IOException
ClosedChannelException
- このチャネルがクローズしている場合
IOException
- その他の入出力エラーが発生した場合public abstract FileChannel position(long newPosition) throws IOException
位置の値をファイルの現在のサイズより大きい値に設定するのは正当な処理です。 しかし、この処理によってファイルのサイズが変更されるわけではありません。ファイルの現在のサイズより大きい値が設定されている位置でバイトを読み取ろうとすると、即座にファイルの終わりが通知されます。同じ位置でバイトを書き込もうとすると、新しいバイトに合わせてファイルのサイズが大きくなります。 以前のファイルの終わりから新しく書き込まれたバイトまでの間に存在するバイトの値は未指定です。
newPosition
- 新しい位置。ファイルの先頭からのバイト数を示す負でない整数
ClosedChannelException
- このチャネルがクローズしている場合
IllegalArgumentException
- 新しい位置が負の値の場合
IOException
- その他の入出力エラーが発生した場合public abstract long size() throws IOException
ClosedChannelException
- このチャネルがクローズしている場合
IOException
- その他の入出力エラーが発生した場合public abstract FileChannel truncate(long size) throws IOException
指定されたサイズが現在のファイルサイズよりも小さい場合、ファイルの末尾が切り詰められ、新しいファイルの終わりに収まらないバイトが破棄されます。指定されたサイズが現在のファイルサイズと同じか、それよりも大きい場合、ファイルサイズは変更されません。どちらの場合も、このチャネルのファイル位置が指定されたサイズよりも大きい場合、そのサイズに合わせてファイルサイズが変更されます。
size
- 新しいサイズ。負ではないバイト数
NonWritableChannelException
- このチャネルが書き込み可能でない場合
ClosedChannelException
- このチャネルがクローズしている場合
IllegalArgumentException
- 新しいサイズが負の値の場合
IOException
- その他の入出力エラーが発生した場合public abstract void force(boolean metaData) throws IOException
このチャネルのファイルがローカルの記憶装置上にある場合、このメソッドの戻り値から、このチャネルの作成時またはこのメソッドの一番最近の呼び出し以降のファイルの変更内容がすべてそのデバイスに書き込まれていることがわかります。この方法により、システムがクラッシュしたとき、重要な情報を損失から保護できます。
一方、ファイルがローカルの記憶装置上にない場合、書き込みは行われません。
metaData パラメータを使って、このメソッドで実行しなければならない入出力操作の数を制限できます。このパラメータに false を渡した場合、記憶装置に書き込む必要があるのは、ファイルのコンテンツの更新内容だけです。 true を渡した場合は、ファイルのコンテンツとメタデータの更新内容を書き込む必要があります。これには、通常 1 個以上の入出力操作が必要です。 このパラメータに実効性があるかどうかは、基礎となるオペレーティングシステムによって決まるため、未指定です。
このメソッドを呼び出すと、チャネルが読み込み専用であっても入出力操作が発生します。たとえば、ファイルのメタデータとして最終アクセス時刻を保存し、ファイルの読み込みのたびに更新するようなオペレーティングシステムもあります。この処理が実際に行われるかどうかはシステムによって決まるため、未指定です。
このメソッドは、このクラスに定義されたメソッドによってこのチャネルのファイルに加えられた変更を強制するだけです。map
メソッド呼び出しによって取得したマップされた byte バッファー
のコンテンツの変更によって生じる変更は、必ずしも強制されません。マップされた byte バッファーの force
メソッドを呼び出すと、バッファーコンテンツに対する変更内容が強制的に書き込まれます。
metaData
- true の場合、このメソッドは、ファイルのコンテンツおよびメタデータを記憶領域に強制的に書き込む必要がある。
それ以外の場合はコンテンツの変更のみを強制的に書き込む
ClosedChannelException
- このチャネルがクローズしている場合
IOException
- その他の入出力エラーが発生した場合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
- その他の入出力エラーが発生した場合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
- その他の入出力エラーが発生した場合public abstract int read(ByteBuffer dst, long position) throws IOException
このメソッドは、バイトがチャネルの現在位置ではなく指定されたファイル位置から読み取られるという点を除けば、read(ByteBuffer)
メソッドと同じです。このメソッドはこのチャネルの位置を変更しません。指定された位置がファイルの現在のサイズより大きい場合、バイトは一切読み取られません。
dst
- バイトの転送先バッファーposition
- 転送が開始されるファイル位置。負でない
IllegalArgumentException
- 位置が負の値の場合
NonReadableChannelException
- このチャネルが読み込み可能でない場合
ClosedChannelException
- このチャネルがクローズしている場合
AsynchronousCloseException
- 読み込み操作の進行中に、別のスレッドによってこのチャネルがクローズされた場合
ClosedByInterruptException
- 読み込み操作の進行中に別のスレッドからの割り込みがあったためにチャネルがクローズし、
現在のスレッドの割り込み状態が設定された場合
IOException
- その他の入出力エラーが発生した場合public abstract int write(ByteBuffer src, long position) throws IOException
このメソッドは、バイトがチャネルの現在位置ではなく指定されたファイル位置から書き込まれるという点を除けば、write(ByteBuffer)
メソッドと同じです。このメソッドはこのチャネルの位置を変更しません。指定された位置が現在のファイルサイズより大きい場合、ファイルサイズは新しいバイトに合わせて大きくなります。 以前のファイルの終わりと新しく書き込まれたバイトの間のバイトの値は未指定です。
src
- バイトの転送元バッファーposition
- 転送が開始されるファイル位置。負でない
IllegalArgumentException
- 位置が負の値の場合
NonWritableChannelException
- このチャネルが書き込み可能でない場合
ClosedChannelException
- このチャネルがクローズしている場合
AsynchronousCloseException
- 書き込み中に別のスレッドによってこのチャネルがクローズされた場合
ClosedByInterruptException
- 書き込み操作の進行中に別のスレッドからの割り込みがあったためにチャネルがクローズし、
現在のスレッドの割り込み状態が設定された場合
IOException
- その他の入出力エラーが発生した場合public abstract MappedByteBuffer map(FileChannel.MapMode mode, long position, long size) throws IOException
ファイルの領域をメモリーにマッピングする処理は、次の 3 つのモードうちいずれかで行われます。
読み込み専用:バッファーを修正しようとすると ReadOnlyBufferException
がスローされる (MapMode.READ_ONLY
)
読み込み/書き込み:バッファーへの変更は最終的にファイルに伝達される。この変更は、同じファイルにマッピングされているその他のプログラムによって認識される場合と、認識されない場合がある (MapMode.READ_WRITE
)
非公開:バッファーへの変更はファイルに伝達されず、同じファイルにマッピングされているその他のプログラムによって認識されることもない。その代わりに、変更された部分の非公開のコピーが作成される (MapMode.PRIVATE
)
このチャネルは、読み込み専用のマッピングの場合は読み込み、読み込み/書き込みのマッピングまたは非公開マッピングの場合は読み込みと書き込みの両方が可能になっていなければなりません。
このメソッドが返すマップされた byte バッファー
の位置はゼロ、リミットと容量は size です。 マークは未定義になります。バッファーとこのバッファーが示すマッピングは、バッファー自体がガベージコレクトされるまで有効です。
マッピングの結果は、その作成に使用されたファイルチャネルには依存しません。たとえば、チャネルをクローズしても、マッピングの有効性は変わりません。
多くの場合、メモリーにマッピングされたファイルの詳細は、本質的に基礎となるオペレーティングシステムに依存するため、未指定です。要求された領域がこのチャネルのファイル内に完全には含まれていない場合、このメソッドの動作は未指定です。基礎となるファイルのコンテンツまたはサイズのどちらが変更されたか、このプログラムによる変更または別のプログラムによる変更のどちらか、および、変更がバッファーに伝達されるかどうかは未指定です。バッファーの変更がファイルに伝達される速度は未指定です。
ほとんどのオペレーティングシステムでは、ファイルをメモリーにマッピングするほうが、通常の read
メソッドまたは write
メソッドを使って数十キロバイトのデータの読み込みまたは書き込みを行うよりも負荷が大きくなります。性能を重視するなら、比較的大きめのファイルだけをマッピングすることをお勧めします。
mode
- ファイルのマッピングを読み取り専用モードで行う場合は FileChannel.MapMode
クラスに定義されている定数 READ_ONLY
、
読み取り/書き込みモードで行う場合は同クラスに定義されている定数 READ_WRITE
、
非公開 (copy-on-write) モードで行う場合は同クラスに定義されている定数 PRIVATE
position
- ファイル内のマッピングされた領域の開始位置。負でないsize
- マッピングされる領域のサイズ。 負でない、Integer.MAX_VALUE
以下の値
NonReadableChannelException
- mode が READ_ONLY
であるのに、このチャネルが読み込み不可の状態になっていた場合
NonWritableChannelException
- mode が READ_WRITE
または PRIVATE
であるのに、
チャネルが読み取り/書き込み不可の状態になっていた場合
IllegalArgumentException
- 上記のパラメータの前提条件が満たされていない場合
IOException
- その他の入出力エラーが発生した場合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
- その他の入出力エラーが発生した場合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
- その他の入出力エラーが発生した場合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
- その他の入出力エラーが発生した場合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
- その他の入出力エラーが発生した場合lock()
,
lock(long,long,boolean)
,
tryLock(long,long,boolean)
|
JavaTM Platform Standard Ed. 6 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。