面试刷题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;

/**
 * 说明:传统流式io 客户端连接服务端例子
 * @author carter
 * 创建时间: 2020年03月25日 9:58 下午
 **/

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;

/**
 * 说明:传统流式io 客户端连接服务端例子
 * @author carter
 * 创建时间: 2020年03月25日 9:58 下午
 **/

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;

/**
 * 说明:nio的客户端连接服务端例子
 * @author carter
 * 创建时间: 2020年03月25日 10:32 下午
 **/

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://img2020.cnblogs.com/other/268922/202003/268922-20200325233150738-94393984.png)

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;

/**
 * 说明:TODO
 * @author carter
 * 创建时间: 2020年03月25日 10:54 下午
 **/

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<AsynchronousSocketChannel, AsynchronousServerSocketChannel>() {
                    @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 ; 并提供了一些示例代码辅助理解。

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

原文地址:https://www.cnblogs.com/snidget/p/12571465.html

时间: 2024-11-08 02:05:57

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

面试刷题21:java并发工具中的队列有哪些?

![image.png](https://img2020.cnblogs.com/other/268922/202003/268922-20200330183801141-1514127119.png) java的线程池的工作队列用到了并发队列.队列一般用在生产者消费者的场景中,处理需要排队的需求. 你好,我是李福春,今天的问题是: ConcurrentLinkedQueue和LinkedBlockingQueue有什么区别? 答:都是java提供的并发安全队列,都提供了等待性的操作,take,

OJ刷题常用的4中基本输入形式

初到OJ网站上刷题,输入形式就是我们要考虑的问题.通过自己的一些摸索,OJ题目的输入形式大体上无外乎4种.下面就详细介绍: 1 输入数据文件中,第一行数据标明了测试数据的数目: 2 输入数据文件中,有标明输入结束的数据 3 输入数据文件中,测试数据一直到文件尾 4 没有输入数据 第1中情形的处理方法: //int i,kase scanf("%d",&kase); for(i=1;i<=kase;i++) { //处理第i中情况 } ...................

刷题 11/05

从昨天开始刷题,但是昨天比较懒,没有总结一下.今天开始总结一下刷题什么的遇到的bug和之前不注意的事情. 顺时针旋转矩阵 有一个NxN整数矩阵,请编写一个算法,将矩阵顺时针旋转90度. 给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转后的NxN矩阵,保证N小于等于300. 很简单的矩阵变换,我是通过两次矩阵变换得到的,首先对角线交换,然后左右翻转就可以了. class Rotate: def rotateMatrix(self, mat, n): c = [[0 for i in range(0

算法之路——POJ刷题(Java,持续更新中)

先拿一些水题来练手了 1.POJ1000 import java.util.Scanner; /** * Created by mxcsky on 2015/1/25. */ public class POJ1000 { public static void main(String[] args){ Scanner in = new Scanner(System.in); int a = in.nextInt(); int b = in.nextInt(); System.out.println

面试刷题26:新冠攻击人类?什么攻击java平台?

可恶的新冠病毒攻击人类,搞得IT就业形势相当不好?好在有钟南山院士带领我们提前开展好了防护工作! java作为基础平台安装在各种移动设备,PC,小型机,分布式服务器集群,各种不同的操作系统上.所以,对java平台层面的攻击也是最多的. 我是李福春,我在准备面试,今天的题目是: Java平台的注入攻击有哪些? 答:攻击需要找到安全漏洞,所谓的安全漏洞是:绕过安全系统限制或者利用程序瑕疵. java平台常见的注入攻击方式如下. 注入攻击 此外还有中间人攻击:即恶意用户在局域网段发送广播,声称自己是服

java面试基础题------》Java 中的父子类静态代码块,代码块,构造方法执行顺序

4.指出下面程序的运行结果. class A { static { System.out.print("1"); } public A() { System.out.print("2"); } } class B extends A{ static { System.out.print("a"); } public B() { System.out.print("b"); } } public class Hello { pu

java面试基础题------》Java 中List、Set、Map异同点

借鉴地址:http://blog.csdn.net/speedme/article/details/22398395 几句喜欢的话,拷贝下来: 世间上本来没有集合,(只有数组参考C语言)但有人想要,所以有了集合 有人想有可以自动扩展的数组,所以有了List 有的人想有没有重复的数组,所以有了set 有人想有自动排序的组数,所以有了TreeSet,TreeList,Tree** 相同点: 1.List,Set,Map将持有对象一律视为Object型别. 2.Collection.List.Set.

面试刷题30:SpringBean的生命周期?

spring是Java软件开发的事实标准. 我是李福春,我在准备面试,今天的问题是:springBean的生命周期是怎样的? 答:spring最基础的能力是IOC(依赖注入),AOP(面向切面编程),ioc改善了模块之间的耦合问题, 依赖注入的方式:set方法,构造方法,成员变量+ @Autowire? :Bean的管理是IOC的主要功能. bean的生命周期完全由spring容器管理,从属性设置到各种依赖关系的注入,简化了开发人员对bean的生命周期认知: Spring的容器中Bean生命周期

[面试算法题重做]翻转句子中单词的顺序

话说工作中算法用的真的多么?????? 虽然工作中用不到,但是你总得换工作吧,防不住笔试面试中问你些这么个玩意. 而且,多思考,有助于活跃头脑了.深深扎入项目中童鞋们还可以活跃活跃,防止生锈. 话不多说,题目如下: 题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.句子中单词以空格符隔开.为简单起见,标点符号和普通字母一样处理. 例如输入“I am a student.”,则输出“student. a am I”. 在何海涛的日记中,分析方法是 先颠倒句子中的所有字符.这时,