IO网络编程面试题(2022)

IO(网络编程)

1、什么是 IO?

IO的定义:IO用于实现对数据的输入和输出操作,流是从起源到接受的有序数据

2、常用的 IO 类有哪些?

1、字节流:FileInputStream、FileOutputStream

2、字符流: FileReader、FileWriter

2、字节缓冲流:BufferedInputStream,BufferedOutputStream
字符缓冲流:BufferedReader,BufferedWriter

3、转换流:InputStreamReader 字节流转字符输入 OutputStreamWriter 字节流转字符输出

4、标准输入输出流:System.in、System.out

5、打印流: PrintStream:字节打印流,PrintWriter:字符打印流

3、你怎么理解 IO、BIO、NIO、AIO?

IO: input/output

io即input/output, 即读写操作,io可以理解为bio,即blocking-io;

bio: 同步阻塞

 bio(blocking-io)即同步阻塞,是Java传统io模型,一个线程触发io操作后必须等待这个io操作执行完成,
 期间不能去做其他工作;

nio:同步非阻塞

 nio(non-blocking-io) 即同步非阻塞io,一个线程触发io操作后它可以立即返回,
 但是它需要不断地轮询去获取执行结果

aio: 异步非阻塞

aio(Asynchronous-io) 是异步非阻塞io,一个线程触发io操作后它可以立即返回去做其他工作,
内核系统将io操作执行完成后会通知该线程。

4、什么是比特(Bit)、字节(Byte)、字符(Char)?

Bit最小的二进制单位 ,是计算机的操作部分取值0或者1。

Byte是计算机中存储数据的单元,是一个8位的二进制数,(计算机内部,一个字节可表示一个英文字母,两个字节可表示一个汉字。) 取值(-128-127)

Char是用户的可读写的最小单位,他只是抽象意义上的一个符号。如‘5’,‘中’,‘¥’等等。在java里面由16位bit组成Char 取值(0-65535)

Bit 是最小单位 计算机他只能认识0或者1

Byte是8个字节 是给计算机看的

字符 是看到的东西 一个字符=二个字节

5、Java 有哪几种类型的流?

一、字节流 InputStream/OutputStream

1、FileInputStream/FileOutputStream:文件字节流,用于文件的读写操作

2、BufferedInputStream/BufferedFileOutputStream:加缓冲区的字节流,用于提高效率

二、字符流 Reader/Writer

1、FileReader/FileWriter:文件字符流,用于文本文件的读写操作

2、BufferedReader/BufferedWriter:加缓冲区的字符流,用于提高效率

三、转换流 InputStreamReader/OutputStreamWriter

6、字节流和字符流的区别?

1、定义

字节流是一种执行8位字节输入和输出的机制,基本单元为字节;
而字符流是Java中执行16位Unicode输入和输出操作的机制,基本单元为Unicode码元。

2、结尾

字节流以stream结尾;而字符流以reader和writer结尾

3、处理方式

字节流是最基本的,采用ASCII编码;它通常用于处理二进制数据,它是按字节来处理的,
实际上它可以处理任意类型的数据,但它不支持直接写入或读取Unicode码元。

字符流采用Unicode编码,它是按虚拟机的encode来处理,也就是要进行字符集的转化;
它通常处理文本数据,它支持写入及读取Unicode码元。

4、缓冲区

字节流默认不使用缓冲区;字符流使用缓冲区。

7、Java 序列化是什么?

java的序列化是将Java对象转换成字节流的过程。当Java对象需要在网络上传输 或者 持久化存储到文件中时,
就需要对 Java 对象进行序列化处理。

8、怎么序列化一个对象?

类实现 Serializable 接口

9、Java 有哪两种序列化方式?

相应的对象实现了序列化接口java.io.Serializable(隐式序列化), 自动序列化所有非static和 transient关键字修饰的成员变量.
相应的对象实现Externalizable接口(显式序列化)。Externalizable 继承了 Serializable,并且增加了两个自定义方法。

void writeExternal(ObjectOutput out) throws IOException;
 
void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;

10、怎么控制类中的某些变量不被序列化?

Transient 关键字的作用是控制变量的序列化,在变量声明前加上该关键字,
可以阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。

11、静态变量能不能被序列化?

静态成员属于类级别的,所以不能序列化,这里的不能序列化的意思,是序列化信息中不包含这个静态成员域

12、OSI 的七层模型都有哪些?

在这里插入图片描述

13、tcp 和 udp 协议的区别?

在这里插入图片描述

14、tcp 为什么要三次握手,两次不行吗?

TCP 的三次握手是为了保证数据的可靠传输的,TCP 是全双工的协议,也就是说通过 TCP 协议发送的协议是要得到回复的,一来一回,所以说对于需要建立 TCP 连接的两端来说,每一端都需要进行一来一回的确认,这就进行三次握手。

   1、A 给 B 发送需要建立连接的请求;

   2、B 给 A 发送可以建立连接的回复;

   3、A 给 B 发送确认收到回复的信息;

在这里插入图片描述

如果只进行二次握手:

1、A 给 B 发送需要建立连接的请求;

2、B 给 A 发送可以建立连接的回复;

   这样看似没有什么问题,但是这样还是不行的,因为第二次握手的时候 B 
   不知道自己发送给 A 的应答包是否可以到达 A;B 只知道了 A 能发,
   并不知道 A 是否能收;所以这样的连接还是不可靠的。

如果进行四次握手:

1、A 给 B 发送需要建立连接的请求;

2、B 给 A 发送可以建立连接的回复;

3、A 给 B 发送确认收到回复的信息;

4、B 给 A 发送确认收到确认的信息;

 当进行到第二步的时候 B 在等待 A 的确认信息,只有等到这个消息,B 才能确认建立连接,
 这样其实就够了,如果需要进行第四次确认也可以,进行 40 次握手也可以,400 次也可以,
 但是握手次数的增多并不能保证通信达到稳定。所以只需要达到了一个最基本的可以建立连接的条件(三次握手)就可以了,
 多次反而会浪费资源,三次握手是保证双方互相明确对端可以收发的最低值。

15 TCP的三次握⼿和四次挥⼿

TCP协议是7层⽹络协议中的传输层协议,负责数据的可靠传输。在建⽴TCP连接时,需要通过三次握⼿来建⽴,过程是:

1.客户端向服务端发送⼀个SYN
2.服务端接收到SYN后,给客户端发送⼀个SYN_ACK
3.客户端接收到SYN_ACK后,再给服务端发送⼀个ACK

在断开TCP连接时,需要通过四次挥⼿来断开,过程是:

1.客户端向服务端发送FIN
2.服务端接收FIN后,向客户端发送ACK,表示我接收到了断开连接的请求,客户端你可以不发数据了,不过服务端这边可能还有数据正在处理
3.服务端处理完所有数据后,向客户端发送FIN,表示服务端现在可以断开连接
4.客户端收到服务端的FIN,向服务端发送ACK,表示客户端也会断开连接了
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值