Java NIO -与IO的区别 -NIO核心 -Buffer核心属性 -直接与非直接缓冲区 -通道Channel -分散与聚集 -字符集 -选择器(略) -阻塞与非阻塞

NIO和IO的区别

Java NIO -与IO的区别 -NIO核心 -Buffer核心属性 -直接与非直接缓冲区 -通道Channel -分散与聚集 -字符集 -选择器(略) -阻塞与非阻塞_第1张图片

Java NIO -与IO的区别 -NIO核心 -Buffer核心属性 -直接与非直接缓冲区 -通道Channel -分散与聚集 -字符集 -选择器(略) -阻塞与非阻塞_第2张图片

NIO的核心

Java NIO -与IO的区别 -NIO核心 -Buffer核心属性 -直接与非直接缓冲区 -通道Channel -分散与聚集 -字符集 -选择器(略) -阻塞与非阻塞_第3张图片

 

Buffer

1.分配缓冲区

2.PUT数据到缓冲区

Java NIO -与IO的区别 -NIO核心 -Buffer核心属性 -直接与非直接缓冲区 -通道Channel -分散与聚集 -字符集 -选择器(略) -阻塞与非阻塞_第4张图片

缓冲区的核心属性

Java NIO -与IO的区别 -NIO核心 -Buffer核心属性 -直接与非直接缓冲区 -通道Channel -分散与聚集 -字符集 -选择器(略) -阻塞与非阻塞_第5张图片

图示

 

Java NIO -与IO的区别 -NIO核心 -Buffer核心属性 -直接与非直接缓冲区 -通道Channel -分散与聚集 -字符集 -选择器(略) -阻塞与非阻塞_第6张图片

读数据模式(position和limit会变)

Java NIO -与IO的区别 -NIO核心 -Buffer核心属性 -直接与非直接缓冲区 -通道Channel -分散与聚集 -字符集 -选择器(略) -阻塞与非阻塞_第7张图片

代码

public class TestBuffer {
		
	@Test
	public void test1() {
		String s = "abcd";
		
		ByteBuffer buf = ByteBuffer.allocate(1024);
		System.out.println("allocate() : ");
		System.out.println(buf.position());
		System.out.println(buf.limit());
		System.out.println(buf.capacity());
		System.out.println();
		
		buf.put(s.getBytes());
		System.out.println(buf.position());
		System.out.println();
		
		buf.flip();
		System.out.println(buf.position());
		System.out.println(buf.limit());
		byte[] dst = new byte[buf.limit()];
		buf.get(dst);
		System.out.println(new String(dst, 0, dst.length));
		System.out.println(buf.position());
		
		
		buf.clear();
		System.out.println((char)buf.get());
		
//		buf.rewind(); 可重复读		
		
		
	}
}

mark(position可以reset到mark的位置)

Java NIO -与IO的区别 -NIO核心 -Buffer核心属性 -直接与非直接缓冲区 -通道Channel -分散与聚集 -字符集 -选择器(略) -阻塞与非阻塞_第8张图片

直接与非直接缓冲区

Java NIO -与IO的区别 -NIO核心 -Buffer核心属性 -直接与非直接缓冲区 -通道Channel -分散与聚集 -字符集 -选择器(略) -阻塞与非阻塞_第9张图片

通道

Java NIO -与IO的区别 -NIO核心 -Buffer核心属性 -直接与非直接缓冲区 -通道Channel -分散与聚集 -字符集 -选择器(略) -阻塞与非阻塞_第10张图片

复制文件(非直接)

Java NIO -与IO的区别 -NIO核心 -Buffer核心属性 -直接与非直接缓冲区 -通道Channel -分散与聚集 -字符集 -选择器(略) -阻塞与非阻塞_第11张图片

通过映射的方法(略)

通道之间的传输(直接缓冲区)

Java NIO -与IO的区别 -NIO核心 -Buffer核心属性 -直接与非直接缓冲区 -通道Channel -分散与聚集 -字符集 -选择器(略) -阻塞与非阻塞_第12张图片

分散与聚集

Java NIO -与IO的区别 -NIO核心 -Buffer核心属性 -直接与非直接缓冲区 -通道Channel -分散与聚集 -字符集 -选择器(略) -阻塞与非阻塞_第13张图片

分散

Java NIO -与IO的区别 -NIO核心 -Buffer核心属性 -直接与非直接缓冲区 -通道Channel -分散与聚集 -字符集 -选择器(略) -阻塞与非阻塞_第14张图片

代码

Java NIO -与IO的区别 -NIO核心 -Buffer核心属性 -直接与非直接缓冲区 -通道Channel -分散与聚集 -字符集 -选择器(略) -阻塞与非阻塞_第15张图片

聚集

Java NIO -与IO的区别 -NIO核心 -Buffer核心属性 -直接与非直接缓冲区 -通道Channel -分散与聚集 -字符集 -选择器(略) -阻塞与非阻塞_第16张图片

字符集(charset)

Java NIO -与IO的区别 -NIO核心 -Buffer核心属性 -直接与非直接缓冲区 -通道Channel -分散与聚集 -字符集 -选择器(略) -阻塞与非阻塞_第17张图片

阻塞与非阻塞

Java NIO -与IO的区别 -NIO核心 -Buffer核心属性 -直接与非直接缓冲区 -通道Channel -分散与聚集 -字符集 -选择器(略) -阻塞与非阻塞_第18张图片

非阻塞式的C/S端代码(先运行服务端再运行C端)

public class TestChannel {
	
	@Test
	public void client() throws Exception {
		//1. 获取通道
		SocketChannel sChannel = SocketChannel.open(new InetSocketAddress("192.168.137.1", 9898));
	
		FileChannel inChannel = FileChannel.open(Paths.get("1.png"), StandardOpenOption.READ);
		
		//2. 分配缓冲区
		ByteBuffer buf = ByteBuffer.allocate(1024);
		
		//3. 读取本地文件,并发送到服务端
		while(inChannel.read(buf) != -1) { //发了个图片给服务端
			buf.flip();
			sChannel.write(buf);
			buf.clear();
		}                               
		
		//4. 关闭通道
		sChannel.close();
		inChannel.close();
	}
	
	@Test
	public void server() throws Exception {
		//1. 获取通道
		ServerSocketChannel ssChannel = ServerSocketChannel.open();
		
		FileChannel outChannel = FileChannel.open(Paths.get("2.png"), 
				StandardOpenOption.WRITE, StandardOpenOption.CREATE);
		
		//2. 绑定连接
		ssChannel.bind(new InetSocketAddress(9898));
		
		//3. 获取客户端连接的通道
		SocketChannel sChannel = ssChannel.accept();
		
		//4. 分配缓冲区
		ByteBuffer buf = ByteBuffer.allocate(1024);
		
		//5. 接受客户端的数据,并保存到本地
		while(sChannel.read(buf) != -1) {
			buf.flip();
			outChannel.write(buf);
			buf.clear();
		}
		
		ssChannel.close();
		outChannel.close();
		sChannel.close();
	}
}

 

非阻塞式演示(服务端写选择器的代码)

管道(pipe)(略)

 

你可能感兴趣的:(Java基础案例教程)