Java SE 7新機能のファイル操作(7)-ランダムアクセスファイル

3296 ワード

転入開発者の空
 
ランダム・アクセス・ファイルでは、読み取りと書き込みを含むファイルの内容に順番にアクセスできません.ファイルにランダムにアクセスするには、ファイルを開き、指定した場所にナビゲートし、ファイルの内容を読み取りまたは書き込みます.Javs SE 7では、SeekableByteChannelインタフェースがこの機能を提供している.SeekableByteChannelは、いくつかの簡単で使いやすい方法を提供しています.これらの方法により、現在の位置を設定またはクエリーし、現在の位置から読むか、現在の位置に書くことができます.このインタフェースでは、*position–チャネルの現在の位置をクエリー*position(long)–チャネルの現在の位置を設定*read(ByteBuffer)–チャネルからバッファにバイト内容を読み込む*write(ByteBffer)–バッファ内のバイト内容をチャネルに書き込む*truncate(long)–チャネルに接続されているファイルを切断する方法があります.実際の使用では、Path.newByteChannelを使用してSeekableByteChannelインスタンスを取得できます.デフォルトのファイルシステムでは、インスタンスを直接使用するか、FileChannelに変換できます.FileChannelは、ファイルの一部をメモリに直接マッピングしてアクセス速度を向上させたり、ロックしたりするなど、より高度な機能を提供します.ファイルの一部、チャネルの現在の位置に影響を与えることなく、指定した絶対位置で直接読み取りまたは書き込みます.次の例では、ファイルを開き、戻ってきたSeekableByteChannelをFileChannelに変換してファイル操作を開始します.まず最初から12バイトを読み出し、ファイルの先頭に再配置し、ここから「I was here!」と書き始めます.ファイルの末尾に移動して「I was here!」を追加します.次に、読み込んだファイルの最初の12バイトをここに追加します.
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;

                String s = "I was here!
"; byte data[] = s.getBytes(); ByteBuffer out = ByteBuffer.wrap(data); ByteBuffer copy = ByteBuffer.allocate(12); FileChannel fc = null; Path file = Paths.get("c:\\testChannel.txt"); try { fc = (FileChannel)file.newByteChannel(StandardOpenOption.READ, StandardOpenOption.WRITE); //Read the first 12 bytes of the file. int nread; do { nread = fc.read(copy); } while (nread != -1 && copy.hasRemaining()); //Write "I was here!" at the beginning of the file. fc.position(0); while (out.hasRemaining()) fc.write(out); out.rewind(); /*Move to the end of the file, write "I was here!" again,then copy the first 12 bytes to the end of the file.*/ long length = fc.size(); fc.position(length); while (out.hasRemaining()) fc.write(out); copy.flip(); while (copy.hasRemaining()) fc.write(copy); } catch (IOException x) { System.out.println("I/O Exception: " + x); } finally { //Close the file. if (fc != null) fc.close(); System.out.println(file + " has been modified!"); }
 
元のファイル内容が123456789 ABCDEFであると仮定すると、プログラム実行後、ファイルの内容はI was hereに変化する!DEFI was here! 123456789 ABCファイルの末尾に位置するとfcに位置することに注意してください.size()は、1を減らしていません.1を減らすと、元のファイルの最後のバイトが上書きされます.