EeBlog(テクニカルブログ)

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

今回からは「チャンネルの入出力」について見ていきます。

チャンネルとは入出力を行うための接続です。

チャンネルによる入出力はバッファ(Buffer)を介して行います。
バッファは次の4つのプロパティを持ちます。
capacityはバッファの容量を表します。
positionはバッファ領域で次に読み書きを行う位置を表します。
limitは読み書きしないバッファ領域の開始位置を表します。
markはマークされている位置を表します。


4つのプロパティの大小関係は次のようになっています。
0 <= mark <= position <= limit <= capacity 次のサンプルコードはテキストファイルを読み込むプログラムです。

import java.io.FileInputStream;

import java.nio.ByteBuffer;

import java.nio.channels.Channels;

import java.nio.channels.ReadableByteChannel;

import java.nio.charset.Charset;


 public class Main {


     public static void main(String[] args) {
         ReadableByteChannel readableByteChannel = null;
         try {
             FileInputStream fileInputStream 
                             = new FileInputStream(“input.txt”);
             readableByteChannel 
                         = Channels.newChannel(fileInputStream);
             ByteBuffer byteBuffer 
               = ByteBuffer.allocate(fileInputStream.available());
             Charset charset = Charset.forName(“Shift-JIS”);
             while (readableByteChannel.read(byteBuffer) > 0) {
                 byteBuffer.flip();
                 System.out.print(charset.decode(byteBuffer));
                 byteBuffer.clear();
             }
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
             try {
                 readableByteChannel.close();
             } catch (Exception e) {}
         }
     }
 }

ChannelsクラスのnewChannelメソッドは指定したバイトストリームから読み込むためのチャネルを構築します。
つまり、ストリームによる入出力をチャンネルによる入出力に切り替えることができます。
戻り値のReadableByteChannelがバイトを読み込むためのチャンネルです。
バッファはBufferクラスのサブクラスであるByteBufferクラスを使用します。

readメソッドを実行するとバッファにデータが書き込まれるため、positionはその分だけ移動します。
flipメソッドの実行はバッファからの読み込み準備です。
具体的には、limitをpositionの値に設定し、positionを0に設定します。
これはバッファに書き込まれた分だけを読み込んで表示するために行っています。
clearメソッドの実行はバッファへの書き込み準備です。
具体的には、limitをcapacityの値に設定し、positionを0に設定します。
これは次にreadメソッドを実行したときに、バッファの先頭から書き込ませるために行っています。

また、今回はテキストファイルからの読み込みなのでCharsetクラスのdecodeメソッドで文字列の複合化を行っています。