Java面试知识点5

1.java中IO流有哪些?

输入和输出都是从程序的角度来说:
输入流-:数据流向程序
输出流-:数据从程序流出;

1.按处理单位:字节流和字符流;字节流:一次读入或读出是8位二进制;字符流:一次读入或读出是16位进制,JDK中后缀是Stream是字节流,后缀是Reader,Writer是字符流;

2.按功能单位:节点流和处理流;节点流->直接与数据源相连,读入或写出;处理流:与节点流一块使用,在节点流的基础上,再套一层;

最根本的四大类:

  1. InputStream(字节输入流):FileInputStream,PipedInputStream,ByteArrayInputStream,BufferedInputStream,SequenceInputStream,DataInputStream,ObjectInputStream;
  2. OutputStream(字节输出流):FileOutputStream,PipedOutputStream,ByteArrayOutputStream,BufferedOutputStream,printStream,DataOutputStream,ObjectOutputStream;
  3. Reader(字符输入流):FileReader,PipedReader,CharArrayReader,BufferedReader,InputStreamReader;
  4. Writer(字符输入流):FileWriter,PipedWriter,CharArrayWriter,BufferedWriter,InputStreamWriter,PrintWriter;

常用的流:

  1. 对文件进行操作:FileInputStream(字节输入流),FileOutputStream(字节输出流),FileReader(字符输入流),FileWriter(字符输出流);
  2. 对管道进行操作:PipedInputStream(字节输入流),PipedOutputStream(字节输出流),PipedReader(字符输入流), PipedWriter(字符输出流);
  3. 字节/字符数组:ByteArrayInputStream,ByteArrayOutputStream,CharArrayReader,CharArrayWriter;
  4. Buffered缓冲流:BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter;
  5. 字节转成成字符流:InputStreamReader,InputStreamWriter;
  6. 数据流:DataInputStream,DataOutputStream;
  7. 打印流:printStream,PrintWriter;
  8. 对象流:ObjectInputStream,ObjectOutputStream;
  9. 序列化流:SequenceInputStream;

2.BIO、NIO、AIO有什么区别?

BIO:线程发起请求,不管内核是否准备好IO操作,从请求发起,线程一直阻塞,直到操作完成。(是一个连接一个线程,同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不作任何事情会造成不必要的线程开销,当然可以通过线程池机制改善)
举例:你到饭馆点餐,然后就等着,啥都干不了,饭没做好,就必须等着。

NIO:线程发起IO请求,立刻返回;内核在完成IO操作以后通过注册的回调函数通知线程进行IO操作。(是一个请求线程,同步非阻塞, 服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理 )
举例:你在饭馆点餐,就去玩了,不过玩一会就回饭馆问还了没。

AIO:线程发起IO请求,立刻返回;内存做好IO操作的准备以后,做IO操作,直到操作完成或者失败,通过调用注册的回调函数通知线程做IO操作。
(异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的IO请求都是由OS先完成了再通知服务器应用去启动线程进行处理)
举例:饭馆打电话说,我们知道你的位置,一会儿给你送过来,自己安心玩,类似外卖。

适用场景
BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求较高,并发局限于应用中;
NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂;
AIO方式适用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂。

3.TCP和UDP的区别?

TCP/IP是一个协议簇,包括很多协议。命名为TCP/IP协议的原因是TCP/IP这两个协议分成重要,应用很广;TCP和UDP都是TCP/IP协议簇的一员。

TCP(Transmission Control Protocol):传输协议控制。
1.面向连接,即必须在双方建立可靠连接之后,才会收发数据;
2.信息包头20个字节;
3.建立可靠连接需要经过三次握手;
4.断开连接需要经过4次挥手;
5.需要维护连接状态;
6.报文头里面的确认序号、累积确认及超时重传机制能保证不丢包、不重复、按序到达;
7.拥有流量控制及拥塞控制的机制;

UDP(User Data Protocol):用户数据报协议
1.不建立可靠连接,无需维护连接状态;
2.信息包头8个字节;
3.接收端,UDP把消息段放在队列中,应用程序从对队列读消息;
4.不受拥挤控制算法的调节;
5.传送数据的速度受应用软件生成数据的速率,传输带宽,源端和终端主机性能的限制;
6.面向数据包,不保证接收端一定能收到;

4.tcp粘包是怎么产生的?

粘包:发送方发送的多个数据包,到接收方缓冲区首尾相连,粘成一包被接收。

原因:TCP协议默认使用Nagle算法可能会把多个数据包一次发送到接收方。应用程序读缓存中的数据包的速度小于接收数据包的速度,缓存中的多个数据包会被应用程序当成一个包一次读取。

处理方法:

  1. 发送方使用TCP_NODELAY选项来关闭Nagle算法;
  2. 数据包增加开始和结束符,应用程序读取,区分数据包;
  3. 在数据包的头部定义整个数据包的长度,应用程序先读取数据包的长度,然后读取整个长度的包字节数据,保证读取的是单个包且完整;

5.OSI的七层模型有哪些?

自下而上:物理层,数据链路层,网络层,传输层,会话层,表达层,应用层;
5层模型自下而上是:物理层,数据链路层,网络层,传输层,应用层;

6.JDK中什么类可以通过流写入数据到内存?输入流和输出流的区别

通过流:java.io.ByteArrayOutputStream 写入数据到内存

区别
1.输入输出的方向是针对程序而言的,向程序读入数据就是输入流;从程序向外写出数据就是输出流;
2.从磁盘、网络、键盘读到内存就是输入流,用InputStream或Reader;
3.写到磁盘、网络、屏幕都是输出流,用OutputStream或Writer;

7.列举常用字节输入流和输出流

FileInputStream-FileOutStream:文件数据读写

ObjectInputStream-ObjectOutputStream:对象数据读写

ByteArrayInputStream-ByteArrayOutputStream:内存字节数组读写

PipedInputStream-PipedOutputStream:管道输入输出

FilterInputStream-FilterOutputStream:过滤输入输出流

InputStreamReader-OutputStreamWriter:字节流转字符流

FileReader-FileWriter:文件字符输入输出流

BufferedReader-BufferedWriter:带缓冲的字符输入输出流

8.字节流和字符流的区别?

按流的处理位置分类:
1.节点流:可以从某节点读数据或向某节点写数据的流,如FileInputStream;
2.处理流:对已存在的流的连接和封装,实现更为丰富的流数据处理,处理流的构造方法必须其他的流对象参数,如BufferedReader;

9.字节流和字符流区别与使用场景

1.Java中的字节流处理的最基本单位为1个字节,通常用来处理二进制数据,字节流类InputStream和OutputStream均为抽象类,代表了基本的输入字节流和输出字节流;
2.Java中的字符流处理的最基本的单元是Unicode代码单元(大小2字节),通常 用来处理文本数据;
区别:
1.字节流操作的基本单元是字节;字符流操作的基本单元是字符;
2.字节默认不使用缓冲区,字符流使用缓冲区;
3.字节流通常用于处理二进制数据,不支持直接读写字符;字符流通常用于处理文本数据;
4.在读写文件需要对文本内容进行处理:按行处理,比较特定字符的时候一般会选择字符流,仅仅读写文件,不处理内容,一般选择字节流;
特征
1.以Stream结尾都是字节流,reader和writer结尾都是字符流;
2.InputStream是所有字节输入流的父类,OutputStream是所有字节输出流的父类;
3.Reader都是字符输入流的父类,Writer是字符输出流的父类;

10.缓冲流的缺点

1.不带缓冲的流读取到一个字节或字符,就直接写出数据;
2.带缓冲的流读取到一个字节或字符,先不输出,等达到了缓冲区的最大容量再一次性写出去;
优点:减少了写出次数,提高了效率;
缺点:接收端可能无法及时再获取到数据;

11.Java中的Socket是什么?

1.Socket也称‘套接字’,用于描述IP地址和端口,是一个通信链的句柄,是应用层与传输层之间的桥梁;
2.应用程序可以通过Socket向网络发出请求或应答网络请求;
3.网络应用程序位于应用层,TCP和UDP属于传输层协议,在应用层和传输层之间,使用Socket来进行连接;
4.Socket是传输层供给应用层的编程接口;
5.Socket编程可以开发客户端和服务器应用程序,可以在本地网络进行通信,也可以通过公网Internet再通信;

12.基于TCP和UDP的Socket编程的主要步骤

1.JDK在java.net包中为TCP和UDP两者通信协议提供了相应的Socket编程类;
2.TCP协议,服务端对应ServerSocket,客户端对应Socket;
3.UDP协议对应DatagramSocket;
4.基于TCP协议创建的套接字可以叫做流套接字,服务器端相当于一个监听器,用来监听端口,服务器与服客户端之间的通讯都是输入输出流来实现的,
5.基于UDP协议的套接字就是数据报套接字,客户端和服务端都要先构造好相应的数据包;

步骤

基于TCP协议的Socket编程的主要步骤:

服务端:

  1. 指定本地的端口创建ServerSocket实例,用来监听指定端口的链接请求;
  2. 通过accept()方法返回的Socket实例,建立了一个和客户端的新连接;
  3. 通过Socket实例获取InputStream和OutputStream读写数据;
  4. 数据传输结束,调用socket实例的close()方法关闭连接;

客户端:

  1. 指定的远程服务器IP地址和端口创建Socket实例;
  2. 通过Socket实例来获取InputStream和OutputStream来进行数据的读写;
  3. 数据传输结束,调用socket实例的close()方法关闭连接;

基于UDP协议的Socket编程的主要步骤:

服务端:

  1. 指定本地的端口创建DatagramSocket实例;
  2. 通过字节数组,创建DatagramPacket实例,调用DatagramSocket实例的receive()方法,用DatagramPacket实例来接收数据;
  3. 设置DatagramPacket实例返回的数据,调用DatagramSocket实例的send()方法来发送数据;
  4. 数据传输结束,调用DatagramSocket实例的close()方法关闭连接;

客户端:

  1. 创建DatagramSocket实例;
  2. 通过IP地址端口和数据创建DatagramSocket实例,调用DatagramSocket实例send()方法发送数据包;
  3. 通过字节数组创建DatagramSocket实例,调用DatagramSocket实例receive()方法接收数据包;
  4. 数据传输完成,调用DatagramSocket实例的close()方法关闭连接;

猜你喜欢

转载自blog.csdn.net/qq_42748009/article/details/112168331