栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

面试刷题11:java系统中io的分类有哪些?

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

面试刷题11:java系统中io的分类有哪些?



随着分布式技术的普及和海量数据的增长,io的能力越来越重要,java提供的io模块提供了足够的扩展性来适应。

我是李福春,我在准备面试,今天的问题是:

java中的io有哪几种?

java中的io分3类:

1,BIO ,即同步阻塞IO,对应java.io包提供的工具;基于流模型,虽然直观,代码实现也简单,但是扩展性差,消耗资源大,容易成为系统的瓶颈;


2,NIO,同步非阻塞io,对应java.nio包提供的工具,基于io多路复用;
核心类: Channel ,Selector , Buffer , Charset  
selector是io多路复用的基础,实现了一个线程高效管理多个客户端连接,通过事件监听处理感兴趣的事件。

3,AIO,即异步非阻塞io, 基于事件和回调 io的类层级




java各种IO的例子 java.io客户端连接服务端例子
package org.example.mianshi.io;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;



public class JavaIOApp {

    public static void main(String[] args) {

 final Server server = new Server();
 new Thread(server).start();

 try (
  Socket socket = new Socket(InetAddress.getLocalHost(), server.getPort());
 ) {
     final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

     bufferedReader.lines().forEach(System.out::println);

 } catch (IOException e) {
     e.printStackTrace();
 }
    }

    public static class Server implements Runnable {

 private ServerSocket serverSocket;

 public int getPort() {
     return serverSocket.getLocalPort();
 }

 @Override
 public void run() {

     try (ServerSocket serverSocket = new ServerSocket(0);) {

  this.serverSocket = serverSocket;
  while (true) {
      final Socket socket = serverSocket.accept();
      new RequestHandler(socket).start();
  }

     } catch (IOException e) {
  e.printStackTrace();
     }

 }

 private class RequestHandler extends Thread {
     private Socket socket;

     public RequestHandler(Socket socket) {
  this.socket = socket;
     }

     @Override
     public void run() {
  try (
   final PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
  ) {

      printWriter.write("hello world");
      printWriter.flush();

  } catch (IOException e) {
      e.printStackTrace();
  }
     }
 }
    }
}



使用连接池优化



package org.example.mianshi.io;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;



public class ThreadPoolJavaIOApp {

    public static void main(String[] args) {

 final Server server = new Server();
 new Thread(server).start();

 try (
  Socket socket = new Socket(InetAddress.getLocalHost(), server.getPort());
 ) {
     final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

     bufferedReader.lines().forEach(System.out::println);

 } catch (IOException e) {
     e.printStackTrace();
 }
    }

    public static class Server implements Runnable {

 private ExecutorService threadPool = Executors.newFixedThreadPool(4);

 private ServerSocket serverSocket;

 public int getPort() {
     return serverSocket.getLocalPort();
 }

 @Override
 public void run() {

     try (ServerSocket serverSocket = new ServerSocket(0);) {

  this.serverSocket = serverSocket;
  while (true) {
      final Socket socket = serverSocket.accept();

      threadPool.submit(new RequestHandler(socket));
  }

     } catch (IOException e) {
  e.printStackTrace();
     }finally {
  threadPool.shutdown();
     }

 }

 private class RequestHandler implements Runnable {
     private Socket socket;

     public RequestHandler(Socket socket) {
  this.socket = socket;
     }

     @Override
     public void run() {
  try (
   final PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
  ) {

      printWriter.write("hello world");
      printWriter.flush();

  } catch (IOException e) {
      e.printStackTrace();
  }
     }
 }
    }
}


java.nio例子
package org.example.mianshi.io;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;



public class JavaNioApp {

    public static void main(String[] args) {

 new Server().start();

 try (
  Socket socket = new Socket(InetAddress.getLocalHost(), 8888);
 ) {
     final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

     bufferedReader.lines().forEach(System.out::println);

 } catch (IOException e) {
     e.printStackTrace();
 }
    }

    public static class Server extends Thread {

 @Override
 public void run() {

     try {
  ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

  serverSocketChannel.bind(new InetSocketAddress(InetAddress.getLocalHost(), 8888));

  serverSocketChannel.configureBlocking(false);

  final Selector selector = Selector.open();

  serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

  while (true) {

      selector.select();
      selector.selectedKeys().forEach(selectionKey -> {
   sayHelloWorld((ServerSocketChannel) selectionKey.channel());
      });

  }

     } catch (IOException e) {
  e.printStackTrace();
     }

 }

 private void sayHelloWorld(ServerSocketChannel channel) {

     try (SocketChannel socketChannel = channel.accept()) {

  socketChannel.write(Charset.defaultCharset().encode("hello world nio"));

     } catch (IOException e) {
  e.printStackTrace();
     }

 }
    }

}



![image.png](https://cdn.nlark.com/yuque/0/2020/png/186661/1585148021697-e4d3340f-bf1f-4f0b-bdc7-6679705cdbf6.png#align=left&display=inline&height=251&name=image.png&originHeight=502&originWidth=1156&size=63253&status=done&style=none&width=578)

java.nio2例子
package org.example.mianshi.io;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.nio.channels.AsynchronousServerSocketChannel;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;
import java.nio.charset.Charset;



public class JavaNio2App {

    public static void main(String[] args) {

 new Server().start();

 try (
  Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
 ) {
     final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

     bufferedReader.lines().forEach(System.out::println);

 } catch (IOException e) {
     e.printStackTrace();
 }


    }

    public static class Server extends Thread {


 @Override
 public void run() {

     try {
  AsynchronousServerSocketChannel serverSocketChannel = AsynchronousServerSocketChannel.open()
   .bind(new InetSocketAddress(InetAddress.getLocalHost(), 9999));

  serverSocketChannel.accept(serverSocketChannel, new CompletionHandler() {
      @Override
      public void completed(AsynchronousSocketChannel socketChannel,
AsynchronousServerSocketChannel serverSocketChannel1) {
//   serverSocketChannel1.accept(socketChannel, this);

   socketChannel.write(Charset.defaultCharset().encode("hello world nio2 "));

   try {
socketChannel.close();
   } catch (IOException e) {
e.printStackTrace();
   }
      }

      @Override
      public void failed(Throwable exc, AsynchronousServerSocketChannel attachment) {
   exc.printStackTrace();
      }
  });

     } catch (IOException e) {
  e.printStackTrace();
     }


 }
    }

}



本例子暂时无法运行。只为展示过程;小结


本篇主要介绍了java提供的3中io,即 BIO,NIO,AIO ; 并提供了一些示例代码辅助理解。

原创不易,转载请注明出处!

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号