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();
    }
}

学習年限が足りなくて、知識が浅くて、言うことが間違っています。


世界には10種類の人がいて、1つはバイナリを知っていて、1つはバイナリを知らないのです。