Java NIO教程(七)FileChanel
3760 ワード
参考:http://ifeve.com/file-channel/ 原文の住所
目次 Java NIO教程 Java NIO教程(一)概要 Java NIO教程(二)Chanel Java NIO教程(三)Buffer Java NIO教程(四)Scater/Gather Java NIO教程(五)チャネル間のデータ伝送 Java NIO教程(六)Selector Java NIO教程(七)FileChanel Java NIO教程(八)SocketChanel Java NIO教程(9)ServerSocketChanel Java NIO教程(10)非ブロッキングサーバ Java NIO教程(十一)Java NIO DatagramChanel Java NIO教程(12)Pipe Java NIO教程(13)Java NIO vs.IO Java NIO教程(14)Java NIO Path Java NIO教程(15)Java NIO Files Java NIO教程(十六)Java NIO Aynch rousFileChanel Java NIOの
FileChanelを開く
複数の
その後、
FileChanelにデータを書きます。
FileChanelを閉じる
ここには二つの例があります。
ファイルの終了符の後に位置を設定し、チャンネルにデータを書き込むと、ファイルが現在位置まで大きくなり、データを書き込みます。これは「ファイルの空き」を引き起こし、ディスク上の物理ファイルに書き込まれたデータの間に空きがあります。
FileChanelのsize方法
FileChanelのフォース方法
以下の例はファイルデータとメタデータを同時にディスクに強制的に書き込みます。
目次
FileChannel
は、ファイルに接続されたチャネルである。ファイルチャンネルを通してファイルを読み書きできます。FileChannel
は、ブロックモードでは常に動作している非ブロッキングモードに設定できません。FileChanelを開く
FileChannel
を使用する前に、まず開けなければなりません。しかし、FileChannel
、InputStream
、OutputStream
、またはRandomAccessFile
を使用して、一つのFileChannel
の例を取得する必要があります。RandomAccessFile
を介してFileChannel
を開く例である。RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw");
FileChannel inChannel = aFile.getChannel();
FileChanelからデータを読み出す複数の
read()
方法のうちの一つを呼び出して、FileChannel
からデータを読み出す。例えば:ByteBuffer buf = ByteBuffer.allocate(48);
int bytesRead = inChannel.read(buf);
まず、Buffer
を割り当てます。FileChannel
から読み出されたデータはBuffer
に読み出される。その後、
FileChannel.read()
方法を呼び出す。この方法は、FileChannel
からBuffer
にデータを読み出す。read()
方法で返されたint
値は、Buffer
に読まれたバイト数を示している。-1に戻ると、ファイルの末尾に表示されます。FileChanelにデータを書きます。
FileChannel.write()
方法を用いてFileChannel
にデータを書き込み、この方法のパラメータはBuffer
である。例えば:String newData = "New String to write to file..." + System.currentTimeMillis();
ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();
buf.put(newData.getBytes());
buf.flip();
while(buf.hasRemaining()) {
channel.write(buf);
}
注意FileChannel.write()
は、while
サイクルで起動される。write()
方法が一度に何バイトをFileChannel
に書き込むことができるかは保証できないので、write()
にチャネルに未記入のバイトがないまで、Buffer
を呼び出す方法を繰り返す必要がある。FileChanelを閉じる
FileChannel
を使い切ったら必ず閉めます。例えば:channel.close();
FileChanelのposition方法FileChannel
のある特定の位置でデータの読み書き動作を行う必要がある場合がある。position()
を呼び出してFileChannel
の現在位置を取得することができる。position(long pos)
を呼び出してFileChannel
の現在位置を設定しても良い。ここには二つの例があります。
long pos = channel.position();
channel.position(pos +123);
ファイルの終了符の後に位置を設定し、ファイルのチャンネルからデータを読み込もうとすると、読み出し方法は-1のファイル終了フラグに戻ります。ファイルの終了符の後に位置を設定し、チャンネルにデータを書き込むと、ファイルが現在位置まで大きくなり、データを書き込みます。これは「ファイルの空き」を引き起こし、ディスク上の物理ファイルに書き込まれたデータの間に空きがあります。
FileChanelのsize方法
FileChannel
例のsize()
方法は、インスタンスに関連するファイルのサイズを返す。例えば:long fileSize = channel.size();
FileChanelのtruncate方法FileChannel.truncate()
方法を使用して、一つのファイルを切り取ることができる。ファイルを切り取るときは、ファイルで指定された長さの後ろの部分が削除されます。例えば:channel.truncate(1024);
この例はファイルの前の1024バイトを切り取ります。FileChanelのフォース方法
FileChannel.force()
方法は、チャネルにディスクに書き込まれていないデータをディスクに強制的に書き込む。パフォーマンスの観点から、オペレーティングシステムはデータをメモリにキャッシュするので、FileChannel
に書き込まれたデータは必ずディスクに書き込まれるとは保証できない。これを保証するには、force()
メソッドを呼び出す必要があります。force()
方法は、ファイルメタデータ(権限情報など)をディスク上に同時に書き込むかどうかを指定するboolean
タイプのパラメータを有する。以下の例はファイルデータとメタデータを同時にディスクに強制的に書き込みます。
channel.force(true);