참고: 동시 프로그래밍 네트워크에서 재인쇄 – ifeve.com이 기사의 링크 주소:Java NIO 시리즈 튜토리얼(2) 채널
Java NIO의 채널은 스트림과 유사하지만 몇 가지 차이점이 있습니다.
다음 중 하나에서 액세스할 수 있습니다. 채널에서 데이터를 읽을 수 있고 채널에 데이터를 쓸 수 있습니다. 그러나 읽기 및 쓰기 스트림은 일반적으로 단방향입니다.
채널은 비동기적으로 읽고 쓸 수 있습니다.
채널의 데이터는 항상 버퍼에서 먼저 읽혀지거나 항상 버퍼에서 쓰여져야 합니다.
위에서 언급한 것처럼 채널에서 버퍼로 데이터를 읽고 버퍼에서 채널로 데이터를 씁니다. 아래 그림과 같이:
다음은 Java NIO에서 가장 중요한 채널의 구현입니다.
FileChannel
DatagramChannel
소켓채널
ServerSocketChannel
FileChannel은 파일에서 데이터를 읽고 씁니다.
DatagramChannel은 UDP를 통해 네트워크의 데이터를 읽고 쓸 수 있습니다.
SocketChannel은 TCP를 통해 네트워크의 데이터를 읽고 쓸 수 있습니다.
ServerSocketChannel은 웹 서버처럼 새로 들어오는 TCP 연결을 모니터링할 수 있습니다. 각각의 새로운 수신 연결에 대해 SocketChannel이 생성됩니다.
다음은 FileChannel을 사용하여 버퍼로 데이터를 읽는 예제입니다.
public class Channel1 {public static void main(String[] args) {try { RandomAccessFile raf = new RandomAccessFile("./.gitignore","rw"); FileChannel channel = raf.getChannel(); //获取通道ByteBuffer bf = ByteBuffer.allocate(50); //通过静态allocate方法创建一个缓冲区,容量为50byte[] bytes = new byte[]{}; bytes = "123".getBytes(); bf = ByteBuffer.wrap(bytes); //通过静态wrap方法,byte数组生成缓冲区,缓冲区中保留了原数据while(bf.hasRemaining()){ System.out.print((char) bf.get()); }int bytesRead ;while ((bytesRead = channel.read(bf)) != -1) { //将通道中的数据写入缓冲区,并判断通道中的数据是否到末尾System.out.println("Read " + bytesRead);bf.flip(); //反转缓冲区 实际上就是将position置为0 后续buffer详细介绍while(bf.hasRemaining()){ //判断缓冲区中是否还有值System.out.print((char) bf.get()); //输出缓冲区中的值 } bf.clear(); //清理缓冲区 } raf.close(); //关闭RandomAccessFile} catch (IOException e) { e.printStackTrace(); } } }
buf.flip() 호출에 주의하세요. 먼저 데이터를 읽어보세요. Buffer 에 넣은 다음 Buffer 를 뒤집은 다음 Buffer 에서 데이터를 읽습니다. 다음 섹션에서는 Buffer
에 대해 더 자세히 설명합니다.위 내용은 JAVA 채널에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!