チャネルインターフェイスでのJava NIO

 

チャネルチャネルは、一部であってもよく、又は指定されたファイルのすべてがバッファに直接マッピングされています。

 

直接チャンネルでデータを読み書きすることができない、チャンネルのみのByteBufferと対話することができます。

データを読み出す場合、ByteBufferのチャンネルのデータ利用の地図データを削除します。

データを書き込む際に、バッファにデータが、データはその後にチャンネルのByteBufferに書き込まれます。

 

チャネルインターフェイスは、一般的に使用される実装クラスがあります:

  • ファイルの読み書きのためのFileChannel
  • DatagramChannelのためのチャネルUDP通信
  • ServerSocketChannel、通信のためのSocketChannelチャンネルTCP

 ここだけUDP、TCPチャンネルの通信のためのFileChannelは、書き込みネットワークプログラミングの時に再導入されます。

 

 

一般的な方法をチャンネル:

  • バイトストリームは、対応するタイプのChannelオブジェクトを取得する//)(.getChannelオブジェクト。唯一のバイトストリームオブジェクトはさらに、getChannel()メソッドを持っています。
  • 緩衝液のみのタイプのByteBuffer、バッファにデータをチャネルに対応する入力ストリームから読み出されたチャネルオブジェクト.read(ByteBufferの緩衝液)//なく、他のタイプのバッファ
  • チャネルオブジェクト.WRITE(ByteBufferの緩衝液)//ストリームに対応するチャネルへのデータバッファ
  • Channelオブジェクトの.position()//チャネルを返しますが、戻り値がlong型で、ポインタの位置を記録しました
  • チャネルオブジェクト.position(長いインデックス)//チャネルレコードポインタが指定された位置に調整されます
  • チャネルオブジェクト.MAP(マッピングモード、開始インデックス、長さ)// /れるMappedByteBufferは、すべてのオブジェクトにマッピングされたファイルの一部は、オブジェクトはれるMappedByteBufferを返します。

 

 

 例:文書を読んでは、一度読んで

1          // チャンネル作成
2          ファイルファイル= 新しい新しい( "./ 1.TXT"ファイル;)
 3          =中FileInputStreamの新しい新しいFileInputStreamを(ファイル);
 4          のFileChannelチャンネル= in.getChannelを();   // チャンネルによる入力ストリームオブジェクトファイルを取得
 5  
。6          // バッファを作成し
7          のByteBufferのByteBuffer = ByteBuffer.allocate(1024 。8  
。9          // バッファチャンネルにデータを読み出します。チャネルは、他の緩衝液と相互作用することができない、のByteBufferと相互作用することができる
10          channel.read(のByteBuffer);
 11  
12          // ポインタを調整するためのByteBufferフリップ()メソッドを呼び出し、データ準備の使用を作る
13         ByteBuffer.flip();
 14  
15          // のByteBufferを復号するためには、CharBufferのに変換します。ByteBufferの直接文字列()に変換することができないので、文字列のtoStringを介してファイルの内容を変換されません。ByteBufferはCharBufferのに変換する必要があります。
16          文字セットのcharset = Charset.forName( "GBK");     //は、文字セットオブジェクトを作成します。Windowsはデフォルトのコード化文字セットがGBKであるデフォルトGBKコーディング、テキストファイルを作成します。
17          // ファイルに対応する文字セットを符号化するために使用ここで符号化文字集合。。我々は、UTF-8を使用して、その後、ここで、作成時にファイルの文字セットがUTF-8で指定したUTF-8またはエクスプローラでファイルをエンコードするために変更した場合は
18          CharsetDecoderデコーダー= charset.newDecoderを();    // デコーダ作成しない
19          ; CharBufferのCharBufferの= decoder.decode(のByteBuffer)を    // 得るCharBufferの、ByteBufferのをデコードするデコーダを使用し
 20  
21          // )CharBufferのは(フリップを呼び出さないで、ここではなく、全くデータ呼
22は、 
23である         // ()、取得チャーによって得ることができる[] GETによって(CHAR [] ARR)、またはのtoStringを使用して()が文字列に変換され、チャーに読み込むことができる
24          のSystem.out.println(charBuffer.get( ));   // 取得し、最初の文字
25          のSystem.out.println(charBuffer.toString());   // 残りの部分は文字列CharBufferの出力に変換されます。データの残りの部分ことに留意されたいです。
26          
27          // オブジェクトのSOUT出力は、オブジェクトは自動的に文字列出力にオブジェクトを変換するためのtoString()メソッドを呼び出します。
28          // ;それのSystem.out.println(CharBufferの)のように書くことができるように、
29          
30          byteBuffer.clear();
 31であり         ; charBuffer.clear()
 32          channel.close();
 33れる          in.close();

 

 

 

例:ファイルを読んで、リードサイクル

1          // チャネルの作成
2          =でFileInputStreamの新しい新規のFileInputStream( "./ 1.TXT" ;)
 。3          のFileChannelチャネル= in.getChannel();
 4  
。5          // バッファを作成し
6          のByteBufferのByteBuffer = ByteBuffer.allocate(102 。7          CharBufferのをCharBufferの;
 8  
。9          // デコーダ作成
10          CharsetDecoder Charset.forName =デコーダの( "GBK" ).newDecoderを();
 11  
12である         。// ループがデータ読み出し
13は         しばらく - {(!channel.read(のByteBuffer)= 1)   / /リード後に()、チャネルポインタが自動的に移動されます。-1データ読めません。
14              ByteBuffer.flip();    // データを調製するために使用されるか
15              CharBufferの= decoder.decode(のByteBufferを);    // 復号器
16              のSystem.out.println(CharBufferの)
 。17              byteBuffer.clear();    // 空の、次の準備のみ使用します。あなたはのByteBufferを空にしなければなりません。
18              / * 
19は、             機構channel.readは(のByteBuffer)のByteBufferにデータチャネルを読み取ることであるので、代わりのチャネルの長さから読み出されたデータを返す、のByteBufferの内容の長さを返します。
20である             のByteBufferが空でない場合、ByteBufferのが一杯になるように再度、いかなる残りの空間が存在しない、最初のサイクルの後、記録のByteBuffer、実行channel.read(のByteBuffer)の端部へのポインタポイント
 21             チャネルは、新しいデータを読み出し、コンテンツの長さが再び実行される(データのByteBufferは、第一使用)-1のByteBufferサイクル等しくない返しません。
図22は、             無限ループにデータを読み出すために初めて使用されたであろう。
23がある             * / 
24              charBuffer.clear();    // 次回の値が自動的に覆われているので、これは、デフォルトすることができます。
25          }
 26は、 
27          channel.close();
 28          in.close()。

 

 

 

例:ファイルを書き込みます

1          // チャネルの作成
2          のFileOutputStream OUT = 新しい新たFileOutputStream( "./ 2.txt" ;)
 。3          のFileChannelチャネル= out.getChannel()
 。4  
。5          // バッファの作成
6。          ByteBufferのバッファ= ByteBuffer.allocate(1024 。7  
。8          // バッファに書き込まれるデータ
9。          buffer.put( "Hello Worldの!" .getBytes());
 10  
。11          @ ポインタを調整するために、利用可能なデータを示します。そうでない場合、利用可能なデータは、バッファ空である
12である         )(buffer.flip;
 13である 
14          // データがバッファ・チャネルに書き込まれます。ファイルに書き込ま同期します。
15         channel.write(バッファ)
16  
17          buffer.clear()。
18          channel.close()。
19          out.close()。

 

上記3つの例、使用緩衝液、およびIOストリーム従来のバッファーの性質が同じで、速度は非常に高速で書き込みが、チャネルのマ​​ッピングを使用しませんでした。

 

 

 

例:マッピングチャンネル読み書きファイル

1つのファイルINFILE = 新しい新規( "./ 1.TXT"ファイル);
 2          のFileChannel inChannel = 新しい新規のFileInputStream(INFILE).getChannel();
 3          のFileChannel outChannel = 新しい新たFileOutputStream( "./ 2.txt" ).getChannel();
 4  
。5          / * 
。6          ドキュメントチャネル入力ストリームがバッファ、チャネルマッピング入力ストリームにマッピングされ、読み取り専用ことができます。
7          ファイル全体をマッピングします。別個のオブジェクトとしてINFILEは、ファイルの長さを得ることである
 8。         * / 
9。          れるMappedByteBuffer inChannel.mapバッファ=(FileChannel.MapMode.READ_ONLY、0 、inFile.length());
 10  
11          // の出力バッファに書き込まれた内容出力ファイルに書き込まれた同期チャネルストリーム、。これは、コピーするファイルを可能にします。
12         outChannel.write(バッファ)
13  
14          inChannel.close()。
15          outChannel.close()。

 

 

 

例:チャンネルマッピングファイルの読み込み

1  // チャネルの作成
2          ファイルINFILE = 新しい新規( "./ 1.TXT"ファイル);
 3          のFileChannel inChannel = 新しい新規のFileInputStream(INFILE).getChannel();
 4  
5。         // バッファにマッピングされた
6。          れるMappedByteBufferバッファ= inChannel.map (FileChannel.MapMode.READ_ONLY、0 、inFile.length());
 7  
。8          // 復号器を作成します。れるMappedByteBufferはCharBufferの使用に変換するのByteBufferのサブクラスです。
9          CharsetDecoder Charset.forName =デコーダ( "GBK"の).newDecoder();
 10          
11          // れるMappedByteBufferデータはれるMappedByteBufferにおけるポインタ調節される前に必ず()反転しない、得られたチャネルマッピング、ポインタが調整されています。
12         // コースbuffer.flip();また、行に書かれた
 13である         
14          // CharBufferの変換
15          CharBufferのCharBufferの= ; decoder.decode(バッファ)
 16  
。17          // CharBufferのに使用されるデータ
18がある         のSystem.out.println(CharBufferの)。
 。19  
20          buffer.clear();
 21である         charBuffer.clear();
 22である          inChannel.close();

 

チャンネルマップが最速で使用してください。大きなファイルのマッピング、など1,2- Gは、使い捨てマップファイル全体がメモリの多くを取る場合は、それは性能低下につながる、それは今順次読み出すループを使用してマッピングすることができます。

唯一のバッファは循環によって読み取らチャネルマッピングを順次使用することなく、用いることができるが、速度が遅くなります。

 

あなたは文字列にデータ(コンテンツ)を持っていない場合は、デコーダを使用する必要はありません。

 

 

 

RandomAccessFileのチャンネルマッピングクラスを使用することもできます。

1       // チャンネル作成
2          =ファイルファイルを新しい新しいファイル( "./ 1.TXTを" );
 3          のRandomAccessFileのRandomAccessFile = 新しい新しいのRandomAccessFile( "RW"ファイル、);   // のRandomAccessFileを使用すると、開いているファイルを指定することができます
4          のFileChannelチャンネル= のRandomAccessFileを。さらに、getChannel();
 5  
。6          / * 
。7          チャネルには、バッファにマッピングされます。
8は         Rのみに開放読み取り、唯一のマップは読み取り専用で、RWにオープンにかかわらず、指定されたマッピングモードの読み取り専用またはマッピングされ、ライト-リード読み書き。
9          その後、ファイル(ファイル同期に)RWチャネルが読み取ることができる、チャネルマッピングを行い、書き込むことができる開かれたが、
 10           * / 
11         バッファは=れるMappedByteBuffer(FileChannel.MapMode.READ_WRITE、0 channel.map 、file.lengthを());
 12は、 
13である          channel.position(file.length()); //はチャネルの端部へのポインタを記録
14          channel.write(バッファ);    // 書き込みバッファチャンネル、すなわち、最後に追加コンテンツコピーの端
15  
16          channel.closeを();
 17          randomAccessFile.close()。

 

利点のRandomAccessFileチャネルマッピングクラスを使用します:

あなたはチャンネルを読んで、だけでなく、同時に読み込まれるファイルのために書くことができますいずれか、書き込みマッピングを開くために道を開くために、ファイルを指定することができます。

 

 

 

注意:

ByteBufferのデータを使用する前に、第1のフリップフロッ()ポインタの位置を調整します。

たとえその後の使用ByteBufferの、最初の呼び出しをクリア()(頻繁に使用するために、データ読み出しサイクルの時に)使用前のByteBufferをクリアします。

 

閉じられていないファイルが、ファイルが対応するフローを閉じます。

RandomAccessFile、チャネルおよび流れは非常に似ている、との両方をクローズする必要があります。

バッファはシャットダウンせず、容器のみではなく、ストリームです。

 

おすすめ

転載: www.cnblogs.com/chy18883701161/p/10928979.html