NIOの3つのコアコンポーネント----Channel(パイプ)
20888 ワード
チャンネル:
1.ストリームに似ていますが、次のような違いがあります.
チャネルは同時に読み書きを行うことができ、ストリームは読み書きしかできないか、または書き込みチャネルは非同期読み書きデータチャネルがバッファからデータを読み取ることができるか、バッファにデータを書くことができる.
2.BIOのstreamは一方向で、Channelは双方向で、読み取り操作も書き込み操作もできます
3 ChannelはNIOで1つのインタフェースです
一般的なチャネルクラスは、FileChannel、DatagramChannel、ServerScoketChannel、SocketChannel FileChannelファイルのデータ読み書き、DatagramChannel UDPのデータ読み書き、ServerScoketChannel、SocketChannel TCPのデータ読み書きです.
NIOのネットワーク通信の流れ
サーバ側では、サーバScoketChannel(ServerScoketChannelImpl)が作成され、対応するクライアントでSocketChannel(SocketChannelImpl)が生成されます.
チャンネルの主な方法:
1.read:チャネルからデータを読み出し、バッファに入れる2.write:バッファデータをチャネルに書き込む.TransferFrom:ターゲットチャネルから現在のチャネル4にデータをコピーします.TransferTo:現在のチャネルからターゲットチャネルの下にデータをコピーするChannelのファイルの読み書き操作を書く:ファイルに書く
package com.jym.nio;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
/**
* @program: JymNetty
* @description: Channel
* @author: jym
* @create: 2020/02/01
*/
public class JymFileChannel {
public static void main(String[] args) throws Exception {
String str = "hello,jym";
FileOutputStream fileOutputStream = new FileOutputStream("D:\\jym.txt");
// fileOutputStream channel, FileChannelImpl
FileChannel fileChannel = fileOutputStream.getChannel();
//
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
// str byteBuffer
byteBuffer.put(str.getBytes());
// byteBuffer ,
byteBuffer.flip();
// byteBuffer fileChannel
fileChannel.write(byteBuffer);
fileOutputStream.close();
}
}
ファイルから内容を読み込みます.
package com.jym.nio;
import java.io.File;
import java.io.FileInputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
/**
* @program: JymNetty
* @description:
* @author: jym
* @create: 2020/02/01
*/
public class JymFileChannel1 {
public static void main(String[] args) throws Exception {
File file = new File("D:\\jym.txt");
FileInputStream fileInputStream = new FileInputStream(file);
// fileInputStream channel, FileChannelImpl
FileChannel fileInputStreamChannel = fileInputStream.getChannel();
ByteBuffer byteBuffer = ByteBuffer.allocate((int)file.length());
//
fileInputStreamChannel.read(byteBuffer);
//
System.out.println(new String(byteBuffer.array()));
fileInputStream.close();
}
}
統合してファイルのコピーを完了しましょう
package com.jym.nio;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
/**
* @program: JymNetty
* @description:
* @author: jym
* @create: 2020/02/01
*/
public class JymFileChannel2 {
public static void main(String[] args) throws Exception {
File file = new File("D:\\ \\1.jpg");
FileInputStream fileInputStream = new FileInputStream(file);
// fileInputStream channel, FileChannelImpl
FileChannel fileInputStreamChannel = fileInputStream.getChannel();
FileOutputStream fileOutputStream = new FileOutputStream("3.jpg");
// fileOutputStream channel, FileChannelImpl
FileChannel fileOutputStreamChannel = fileOutputStream.getChannel();
ByteBuffer byteBuffer = ByteBuffer.allocate(512);
while (true){
byteBuffer.clear();
//
int read = fileInputStreamChannel.read(byteBuffer);
if(read == -1){
break;
}
// ,
byteBuffer.flip();
// byteBuffer fileChannel
fileOutputStreamChannel.write(byteBuffer);
}
fileInputStream.close();
fileOutputStream.close();
}
}
注意:ループでデータを読み込むときは、clean()を必要とします.cleanを使わないと、常に0を読み取っています.デッドループに入るにはtransferの方法でファイルのコピーを行います.この流れは簡単です.
package com.jym.nio;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.channels.FileChannel;
/**
* @program: JymNetty
* @description: transfer
* @author: jym
* @create: 2020/02/01
*/
public class JymFileChannel3 {
public static void main(String[] args) throws Exception {
File file = new File("D:\\ \\1.jpg");
FileInputStream fileInputStream = new FileInputStream(file);
FileChannel fileInputStreamChannel = fileInputStream.getChannel();
FileOutputStream fileOutputStream = new FileOutputStream("4.jpg");
FileChannel fileOutputStreamChannel = fileOutputStream.getChannel();
fileOutputStreamChannel.transferFrom(fileInputStreamChannel,0,fileInputStreamChannel.size());
fileInputStreamChannel.close();
fileOutputStreamChannel.close();
fileInputStream.close();
fileOutputStream.close();
}
}