一、常见I/O
(1)基于字节的IO操作
(2)基于字符的IO操作
(3)总结IO操作
二、NIO
举例:
(1)服务器
package Selector;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;
public class ServerNIO {
public static void main(String[]args){
try{
ServerSocketChannel ssc=ServerSocketChannel.open();
ssc.socket().bind(new InetSocketAddress("127.0.0.1",8000));
ssc.configureBlocking(false);
Selector selector=Selector.open(); //选择器
//注册channel
ssc.register(selector,SelectionKey.OP_ACCEPT);
ByteBuffer readBuff=ByteBuffer.allocate(1024);
ByteBuffer writeBuff=ByteBuffer.allocate(128);
writeBuff.put("Received".getBytes());
writeBuff.flip();
while(true){
Set<SelectionKey>keys=selector.selectedKeys();
Iterator<SelectionKey>it=keys.iterator();
while(it.hasNext()){
SelectionKey key=it.next();
it.remove();
if(key.isAcceptable()){
SocketChannel socketChannel=ssc.accept();
socketChannel.configureBlocking(false);
socketChannel.register(selector, SelectionKey.OP_READ);
}else if(key.isReadable()){
SocketChannel socketChannel=(SocketChannel)key.channel();
readBuff.clear();
socketChannel.read(readBuff);
readBuff.flip();
System.out.println("Recieved:"+new String(readBuff.array()));
key.interestOps(SelectionKey.OP_WRITE);
}else if(key.isWritable()){
writeBuff.rewind();
SocketChannel socketChannel=(SocketChannel)key.channel();
socketChannel.write(writeBuff);
key.interestOps(SelectionKey.OP_READ);
}
}
}
}catch(Exception e){
}
}
}
(2)客户端
package Selector;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
public class ClientNIO {
public static void main(String[]args){
try{
SocketChannel socketChannel=SocketChannel.open();
socketChannel.connect(new InetSocketAddress("127.0.0.1",8000));
ByteBuffer writeBuffer=ByteBuffer.allocate(32);
ByteBuffer readBuffer=ByteBuffer.allocate(32);
writeBuffer.put("Hello World".getBytes());
writeBuffer.flip();
while(true){
writeBuffer.rewind();
socketChannel.write(writeBuffer); //通道读数据
readBuffer.clear();
socketChannel.read(readBuffer); //通道写数据
}
}catch(Exception e){
System.out.println(e);
}
}
}