public abstract class FileChannel extends AbstractInterruptibleChannel implements SeekableByteChannel, GatheringByteChannel, ScatteringByteChannel
ファイルチャネルは、ファイルに接続される SeekableByteChannel
です。これは、ファイル内に、照会
および変更
が可能な現在の位置を持っています。ファイル自体には、読み込み/書き込みと現在のサイズ
の照会が可能な可変長のバイトシーケンスが含まれています。ファイルのサイズは、現在のサイズを上回るバイト数が書き込まれると大きくなり、切り捨て
によって小さくなります。ファイルには、アクセス許可、コンテンツタイプ、最終更新時間などのメタデータも関連付けられています。このクラスは、メタデータアクセスのためのメソッドを定義しません。
このクラスは、バイトチャネルに対する一般的な操作 (読み込み、書き込み、クローズ) のほかに、次のようなファイル固有の操作を定義します。
ファイルの領域はメモリーに直接マッピング
される。ファイルのサイズが大きい場合は、通常の読み込みメソッドや書き込みメソッドを呼び出すより、この方法のほうが効率的。
ファイルの更新は、基礎となっている記憶装置にforced out
されます。したがって、システムがクラッシュしてもデータの損失は回避されます。
バイトはファイルからほかのチャネルへ
転送できる。反対に、ほかのチャネルから
転送することもできる。多くのオペレーティングシステムでは、ファイルシステムのキャッシュとの間で非常に高速で直接転送することにより、この転送を最適化できる。
ファイルの領域は、その他のプログラムからアクセスできないようにロック
されます。
ファイルチャネルは、複数の並行スレッドで安全に使用できます。close
メソッドは、Channel
インタフェースの指定どおりにいつでも呼び出せます。チャネルの位置を使用する操作、またはファイルサイズを変更する可能性がある操作は、1 つずつ実行することになっています。前の操作の進行中に同じような操作を新しく開始しようとすると、最初の操作が終わるまで新しい操作はブロックされます。その他の操作、とりわけ明示的な位置を使用する操作は、前の操作と同時並行で実行できます。同時並行処理が行われるかどうかは基礎となる実装によって決まるため、未指定です。
このクラスのインスタンスによって提供されたファイルのビューは、同じプログラム内のその他のインスタンスによって提供された同じファイルのビューと矛盾しないことが保証されています。しかし、基礎となるオペレーティングシステムのキャッシュ処理や、ネットワークファイルシステムプロトコルによる遅延が原因で、このクラスのインスタンスによって提供されたビューと、並行して実行されているプログラムで認識されるその他のビューが矛盾する可能性がないわけではありません。この問題は、これらのプログラムを記述している言語の違いや、これらが同一マシンで実行されているかどうかとは関係なく発生します。こうした矛盾は、システムによって生じるものであるため未指定です。
ファイルチャネルは、このクラスによって定義される open
メソッドの 1 つを呼び出すことによって作成されます。ファイルチャネルは、同じ基本となるファイルに接続されているファイルチャネルを返す、オブジェクトの getChannel メソッドを呼び出すことで、既存の FileInputStream
、FileOutputStream
、または RandomAccessFile
オブジェクトから取得することもできます。ファイルチャネルを既存のストリームまたはランダムアクセスファイルから取得する場合、ファイルチャネルの状態は、チャネルを返した 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)
このチャネルのファイルの領域を直接メモリーにマッピングします。
|
static FileChannel |
open(Path path, OpenOption... options)
ファイルを開くか作成し、そのファイルにアクセスするためのファイルチャネルを返します。
|
static FileChannel |
open(Path path, Set<? extends OpenOption> options, FileAttribute<?>... attrs)
ファイルを開くか作成し、そのファイルにアクセスするためのファイルチャネルを返します。
|
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)
指定されたバッファーのバイトシーケンスをこのチャネルの指定されたファイル位置に書き込みます。
|
begin, close, end, implCloseChannel, isOpen
public static FileChannel open(Path path, Set<? extends OpenOption> options, FileAttribute<?>... attrs) throws IOException
options
パラメータはファイルを開く方法を決定します。READ
と WRITE
オプションにより、ファイルを読み取りまたは書き込みで開くべきかどうかが決定されます。いずれのオプション (または APPEND
オプション) も配列に含まれていない場合、ファイルは読み取り可能です。デフォルトでは、読み取りまたは書き込みはファイルの最初から始まります。
READ
および WRITE
以外に、次のオプションが存在する場合があります。
オプション | 説明 |
---|---|
APPEND |
このオプションが存在する場合は、ファイルは書き込みのために開かれ、チャネルの write メソッドの各呼び出しは、まず位置をファイルの終わりに進めてから要求されたデータを書き込みます。このような位置の移動とデータの書き込みは、不可分な単一の操作として行われます。この操作は、システムに依存しているため未指定です。このオプションは、READ または TRUNCATE_EXISTING オプションと同時には使用できません。 |
TRUNCATE_EXISTING |
このオプションが存在する場合は、既存のファイルはサイズが 0 バイトに切り詰められます。このオプションは、ファイルを読み取り専用に開いた場合は無視されます。 |
CREATE_NEW |
このオプションがある場合、新しい空のファイルが作成され、ファイルがすでに存在する場合は失敗します。ファイルの作成時に、ファイルがあるかどうかのチェックや、ない場合のファイルの生成は、ほかのファイルシステムの操作に対して原子的です。このオプションは、ファイルを読み取り専用に開いた場合は無視されます。 |
CREATE |
このオプションが存在する場合は、既存のファイルが存在する場合はそれが開かれ、そうでない場合は新しいファイルが作成されます。ファイルの作成時に、ファイルがあるかどうかのチェックや、ない場合のファイルの生成は、ほかのファイルシステムの操作に対して原子的です。このオプションは、CREATE_NEW オプションも存在する場合またはファイルを読み取り専用に開いた場合は無視されます。 |
DELETE_ON_CLOSE |
このオプションがある場合、実装はファイルがclose メソッドによって閉じられるときに、ベストエフォートでファイルを削除しようとします。close メソッドが呼び出された場合、Java 仮想マシンの終了時にファイルを削除するためのベストエフォートの試みが行われます。 |
SPARSE |
新しいファイルの作成時に、このオプションは新しいファイルがスパースであることのヒントになります。このオプションは、新しいファイルを作成しない場合は無視されます。 |
SYNC |
ファイルの内容またはメタデータの更新は、基本となる記憶装置に同期的に書き込まれることを必要とします。(「同期入出力ファイル整合性」を参照)。 |
DSYNC |
ファイルの内容の更新は、基本となる記憶装置に同期的に書き込まれることを必要とします。(「同期入出力ファイル整合性」を参照)。 |
実装は、追加のオプションをサポートする場合もあります。
attrs
パラメータは、ファイルの作成時に原子的に設定される、ファイル file-attributes
のオプションの配列です。
新しいチャネルは、Path
を作成したプロバイダ上で newFileChannel
メソッドを呼び出すことによって作成されます。
path
- 開くまたは作成するファイルのパスoptions
- ファイルを開く方法を指定するオプションattrs
- ファイルの作成時に原子的に設定されるファイル属性のオプションのリストIllegalArgumentException
- セットにオプションの無効な組み合わせが含まれる場合UnsupportedOperationException
- path
が、ファイルチャネルの作成をサポートしないプロバイダに関連付けられている場合、未サポートのオープンオプションが指定された場合、またはファイルの作成時に原子的に設定できない属性が配列に含まれる場合IOException
- 入出力エラーが発生した場合SecurityException
- セキュリティーマネージャーがインストールされ、それが実装によって必要とされる未指定のアクセス権を拒否する場合。デフォルトプロバイダで、ファイルが読み取り用に開かれた場合は、SecurityManager.checkRead(String)
メソッドが呼び出されてファイルへの読み取りアクセスがチェックされます。ファイルが書き込み用に開かれた場合は、SecurityManager.checkWrite(String)
メソッドが呼び出されて書き込みアクセスがチェックされます。public static FileChannel open(Path path, OpenOption... options) throws IOException
このメソッド呼び出しの動作は、次の呼び出しの動作とまったく同一です。
fc.open
(file, opts, new FileAttribute<?>[0]);
ここで、opts
は options
配列で指定されたオプションセットです。path
- 開くまたは作成するファイルのパスoptions
- ファイルを開く方法を指定するオプションIllegalArgumentException
- セットにオプションの無効な組み合わせが含まれる場合UnsupportedOperationException
- path
がファイルチャネルの作成をサポートしないプロバイダに関連付けられている場合、または未サポートのオープンオプションが指定された場合IOException
- 入出力エラーが発生した場合SecurityException
- セキュリティーマネージャーがインストールされ、それが実装によって必要とされる未指定のアクセス権を拒否する場合。デフォルトプロバイダで、ファイルが読み取り用に開かれた場合は、SecurityManager.checkRead(String)
メソッドが呼び出されてファイルへの読み取りアクセスがチェックされます。ファイルが書き込み用に開かれた場合は、SecurityManager.checkWrite(String)
メソッドが呼び出されて書き込みアクセスがチェックされます。public abstract int read(ByteBuffer dst) throws IOException
バイトの読み込みは、このチャネルの現在のファイル位置から開始されます。その後、実際に読み込まれたバイト数によりファイル位置が更新されます。それ以外の場合は、このメソッドは ReadableByteChannel
インタフェースの指定どおりに動作します。
read
、インタフェース: ReadableByteChannel
read
、インタフェース: SeekableByteChannel
dst
- バイトの転送先バッファーClosedChannelException
- このチャネルがクローズしている場合AsynchronousCloseException
- 読み取り操作の進行中に、別のスレッドによってこのチャネルがクローズされた場合ClosedByInterruptException
- 読み取り操作の進行中に、別のスレッドからの割り込みがあったためにチャネルがクローズし、現在のスレッドの割り込みステータスが設定された場合IOException
- その他の入出力エラーが発生した場合public abstract long read(ByteBuffer[] dsts, int offset, int length) throws IOException
バイトの読み込みは、このチャネルの現在のファイル位置から開始されます。その後、実際に読み込まれたバイト数によりファイル位置が更新されます。それ以外の場合は、このメソッドは ScatteringByteChannel
インタフェースの指定どおりに動作します。
read
、インタフェース: ScatteringByteChannel
dsts
- バイトの転送先バッファーoffset
- 最初のバイトの転送先となるバッファー配列内のオフセット。dsts.length 以下の負でない値length
- アクセスされる最大バッファー数。dsts.length - offset 以下の負でない値ClosedChannelException
- このチャネルがクローズしている場合AsynchronousCloseException
- 読み取り操作の進行中に、別のスレッドによってこのチャネルがクローズされた場合ClosedByInterruptException
- 読み取り操作の進行中に、別のスレッドからの割り込みがあったためにチャネルがクローズし、現在のスレッドの割り込みステータスが設定された場合IOException
- その他の入出力エラーが発生した場合public final long read(ByteBuffer[] dsts) throws IOException
バイトの読み込みは、このチャネルの現在のファイル位置から開始されます。その後、実際に読み込まれたバイト数によりファイル位置が更新されます。それ以外の場合は、このメソッドは ScatteringByteChannel
インタフェースの指定どおりに動作します。
read
、インタフェース: ScatteringByteChannel
dsts
- バイトの転送先バッファーClosedChannelException
- このチャネルがクローズしている場合AsynchronousCloseException
- 読み取り操作の進行中に、別のスレッドによってこのチャネルがクローズされた場合ClosedByInterruptException
- 読み取り操作の進行中に、別のスレッドからの割り込みがあったためにチャネルがクローズし、現在のスレッドの割り込みステータスが設定された場合IOException
- その他の入出力エラーが発生した場合public abstract int write(ByteBuffer src) throws IOException
チャネルが追加モード以外の場合、バイトの書き出しは、このチャネルの現在のファイル位置から開始されます。追加モードでは、最初に、位置がファイルの末尾まで進みます。ファイルのサイズは、書き込まれたバイト数に合わせ、必要であれば大きくなります。ファイル位置は、実際に書き込まれたバイト数によって更新されます。それ以外の場合は、このメソッドは WritableByteChannel
インタフェースの指定どおりに動作します。
write
、インタフェース: SeekableByteChannel
write
、インタフェース: WritableByteChannel
src
- バイトの取得先バッファーClosedChannelException
- このチャネルがクローズしている場合AsynchronousCloseException
- 書き込み操作の進行中に別のスレッドによってこのチャネルがクローズされた場合ClosedByInterruptException
- 書き込み中に別のスレッドからの割り込みがあったためにチャネルがクローズし、現在のスレッドの割り込みステータスが設定された場合IOException
- その他の入出力エラーが発生した場合public abstract long write(ByteBuffer[] srcs, int offset, int length) throws IOException
チャネルが追加モード以外の場合、バイトの書き出しは、このチャネルの現在のファイル位置から開始されます。追加モードでは、最初に、位置がファイルの末尾まで進みます。ファイルのサイズは、書き込まれたバイト数に合わせ、必要であれば大きくなります。ファイル位置は、実際に書き込まれたバイト数によって更新されます。それ以外の場合は、このメソッドは GatheringByteChannel
インタフェースの指定どおりに動作します。
write
、インタフェース: GatheringByteChannel
srcs
- バイトの取得先バッファーoffset
- 最初のバイトの取得先となるバッファー配列内のオフセット。srcs.length 以下の負でない値length
- アクセスされる最大バッファー数。srcs.length - offset 以下の負でない値ClosedChannelException
- このチャネルがクローズしている場合AsynchronousCloseException
- 書き込み操作の進行中に別のスレッドによってこのチャネルがクローズされた場合ClosedByInterruptException
- 書き込み中に別のスレッドからの割り込みがあったためにチャネルがクローズし、現在のスレッドの割り込みステータスが設定された場合IOException
- その他の入出力エラーが発生した場合public final long write(ByteBuffer[] srcs) throws IOException
チャネルが追加モード以外の場合、バイトの書き出しは、このチャネルの現在のファイル位置から開始されます。追加モードでは、最初に、位置がファイルの末尾まで進みます。ファイルのサイズは、書き込まれたバイト数に合わせ、必要であれば大きくなります。ファイル位置は、実際に書き込まれたバイト数によって更新されます。それ以外の場合は、このメソッドは GatheringByteChannel
インタフェースの指定どおりに動作します。
write
、インタフェース: GatheringByteChannel
srcs
- バイトの取得先バッファーClosedChannelException
- このチャネルがクローズしている場合AsynchronousCloseException
- 書き込み操作の進行中に別のスレッドによってこのチャネルがクローズされた場合ClosedByInterruptException
- 書き込み中に別のスレッドからの割り込みがあったためにチャネルがクローズし、現在のスレッドの割り込みステータスが設定された場合IOException
- その他の入出力エラーが発生した場合public abstract long position() throws IOException
position
、インタフェース: SeekableByteChannel
ClosedChannelException
- このチャネルがクローズしている場合IOException
- その他の入出力エラーが発生した場合public abstract FileChannel position(long newPosition) throws IOException
位置の値をファイルの現在のサイズより大きい値に設定するのは正当な処理です。しかし、この処理によってファイルのサイズが変更されるわけではありません。ファイルの現在のサイズより大きい値が設定されている位置でバイトを読み取ろうとすると、即座にファイルの終わりが通知されます。同じ位置でバイトを書き込もうとすると、新しいバイトに合わせてファイルのサイズが大きくなります。以前のファイルの終わりから新しく書き込まれたバイトまでの間に存在するバイトの値は未指定です。
position
、インタフェース: SeekableByteChannel
newPosition
- 新しい位置。ファイルの先頭からのバイト数を示す負でない整数ClosedChannelException
- このチャネルがクローズしている場合IllegalArgumentException
- 新しい位置が負の値の場合IOException
- その他の入出力エラーが発生した場合public abstract long size() throws IOException
size
、インタフェース: SeekableByteChannel
ClosedChannelException
- このチャネルがクローズしている場合IOException
- その他の入出力エラーが発生した場合public abstract FileChannel truncate(long size) throws IOException
指定されたサイズが現在のファイルサイズよりも小さい場合、ファイルの末尾が切り詰められ、新しいファイルの終わりに収まらないバイトが破棄されます。指定されたサイズが現在のファイルサイズと同じか、それよりも大きい場合、ファイルサイズは変更されません。どちらの場合も、このチャネルのファイル位置が指定されたサイズよりも大きい場合、そのサイズに合わせてファイルサイズが変更されます。
truncate
、インタフェース: SeekableByteChannel
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、排他ロックを要求する場合は falseIllegalArgumentException
- 上記のパラメータの前提条件が満たされていない場合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)
バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.