EeBlog(テクニカルブログ)

第102回 チャンネルの入出力

引き続き「チャンネルの入出力」について見ていきます。

前回はチャンネルを使ってファイルを読み込むプログラムを作成したので、今回は書き込むプログラムを作成したいと思います。

次のサンプルコードはテキストファイルに書き込むプログラムです。
同じ文字列を100行出力します。

 import java.io.FileOutputStream;
 import java.nio.ByteBuffer;
 import java.nio.channels.Channels;
 import java.nio.channels.WritableByteChannel;
 import java.nio.charset.Charset;


 public class Main {


     private static final String LINE_DATA = "株式会社イーブ" 
                                             + System.getProperty("line.separator");


     public static void main(String[] args) {
         WritableByteChannel writableByteChannel = null;
         try {
             FileOutputStream fileOutputStream 
                              = new FileOutputStream("output.txt", true);
             writableByteChannel = Channels.newChannel(fileOutputStream);
             Charset charset = Charset.forName("Shift-JIS");
             ByteBuffer byteBuffer = charset.encode(LINE_DATA);
             for (int i = 0; i < 100; i++) {
                 writableByteChannel.write(byteBuffer);
                 byteBuffer.rewind();
             }
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
             try {
                 writableByteChannel.close();
             } catch (Exception e) {}
         }
     }
 }

ChannelsクラスのnewChannelメソッドは指定したバイトストリームに書き込むためのチャネルを構築します。
戻り値のWritableByteChannelがバイトを書き込むためのチャンネルです。
今回はテキストファイルに書き込むため、Charsetクラスのencodeメソッドで文字列を符号化し、バッファを作成しています。

writeメソッドを実行するとバッファからデータが読み込まれるため、positionはその分だけ移動します。(このプログラムではlimitの位置まで移動します。)
rewindメソッドの実行は再読み込みの準備です。
具体的には、limitはそのままで、positionを0に設定します。
これは次にwriteメソッドを実行したときに、バッファの先頭から読み込ませるために行っています。