NIO 가 사용 하 는 간단 한 예
9015 단어 자바
File f = new File("abcd");
File f2 = new File("abcd2");
try (RandomAccessFile accessFile = new RandomAccessFile(f, "r");
RandomAccessFile accessFile2 = new RandomAccessFile(f2, "rw");
FileChannel fileChannel = accessFile.getChannel();
FileChannel fileChannel2 = accessFile2.getChannel();)
{
fileChannel2.position(fileChannel2.size());
ByteBuffer buffer = ByteBuffer.allocate(128);
while (fileChannel.read(buffer) > 0)
{
buffer.flip();
while (buffer.hasRemaining())
{
fileChannel2.write(buffer);
}
buffer.clear();
System.out.println("------");
}
}
RandomAccessFile 에서 FileChannel 을 가 져 옵 니 다.ByteBuffer 를 통 해 FileChannel 에서 데 이 터 를 읽 을 수도 있 고 FileChannel 에 데 이 터 를 쓸 수도 있 습 니 다.데 이 터 를 쓸 때 while 순환 을 사용 해 야 합 니 다.ByteBuffer 가 한꺼번에 데 이 터 를 모두 기록 할 수 는 없 기 때 문 입 니 다.fileChannel.force(true)방법 은 메모리 데 이 터 를 디스크 에 강제로 동기 화 합 니 다.(boolean 매개 변 수 는 파일 메타 데 이 터 를 기록 할 지 여부(권한 정보 등)를 표시 합 니 다.ByteBuffer 읽 기와 쓰기 사이 에 호출 방법 이 필요 합 니 다.
2.Selector 를 사용 하면 차단 되 지 않 은 channel 만 selector 에 등록 할 수 있 기 때문에 차단 되 지 않 은 channel 을 사용 해 야 합 니 다.여기 서 socketChannel 과 socketServerChannel 을 사용 하여 시범 을 보 여 줍 니 다.예제 코드 는 다음 과 같 습 니 다.
클 라 이언 트 코드:
public class SocketNio
{
private static Charset charset = Charset.forName("UTF-8");
private static int IO_LENGTH = 20;
private static int BUFFER_SIZE = 128;
private static int PORT = 8090;
public static void main(String[] args)
throws IOException
{
SocketChannel channel = SocketChannel.open();
channel.connect(new InetSocketAddress(PORT));
ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);
@SuppressWarnings("resource")
Scanner input = new Scanner(System.in);
while (true)
{
String s = input.nextLine();
buffer.clear();
for (int i = 0; i < Math.ceil(s.length() / (double)IO_LENGTH); i++)
{
buffer.put(charset.encode(i * IO_LENGTH + IO_LENGTH > s.length() ? s.substring(i * IO_LENGTH)
: s.substring(i * IO_LENGTH, i * IO_LENGTH + IO_LENGTH)));
buffer.flip();
while (buffer.hasRemaining())
{
channel.write(buffer);
}
buffer.clear();
}
}
}
}
클 라 이언 트 는 데 이 터 를 보 내 는 기능 만 실현 했다.
서버 코드 는 다음 과 같 습 니 다.
public class SocketServerNIO
{
private static Charset charset = Charset.forName("UTF-8");
private static int PORT = 8090;
private static int BUFFER_SIZE = 128;
public static void main(String[] args)
throws IOException
{
ServerSocketChannel channel = ServerSocketChannel.open();
channel.bind(new InetSocketAddress(PORT));
channel.configureBlocking(false);
final Selector selector = Selector.open();
channel.register(selector, SelectionKey.OP_ACCEPT);
while (selector.select() > 0)
{
Set selectedKeys = selector.selectedKeys();
Iterator keyIterator = selectedKeys.iterator();
while (keyIterator.hasNext())
{
SelectionKey key = keyIterator.next();
if (key.isAcceptable())
{
SocketChannel sc = ((ServerSocketChannel)key.channel()).accept();
sc.configureBlocking(false);
sc.register(selector, SelectionKey.OP_READ);
// sk Channel
key.interestOps(SelectionKey.OP_ACCEPT);
}
if (key.isReadable())
{
// SelectionKey Channel
SocketChannel sc = (SocketChannel)key.channel();
ByteBuffer buff = ByteBuffer.allocate(BUFFER_SIZE);
String content = "";
try
{
while (sc.read(buff) > 0)
{
buff.flip();
content += charset.decode(buff);
buff.clear();
}
System.out.println(" :" + content);
key.interestOps(SelectionKey.OP_READ);
}
// sk Channel , Channel Client ,
// Selector sk
catch (IOException e)
{
keyIterator.remove();
key.cancel();
if (key.channel() != null)
key.channel().close();
}
}
keyIterator.remove();
}
}
}
}
서버 는 socketServerChannel 을 모든 클 라 이언 트 와 연 결 된 socketChannel 을 selector 감청 에 추가 합 니 다.데이터 기록 이 있 는 것 을 감지 할 때마다 서버 는 기록 데 이 터 를 인쇄 합 니 다.등 록 된 채널 마다 비 차단 모드 로 설정 되 어 있 음 을 주의 하 십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.