Java面试总结——输入输出流

1.java中有几种类型的流?

JDK提供的流继承了四大类:
  InputStream(字节输入流),OutputStream(字节输出流),Reader(字符输入流),Writer(字符输出流)。
  (1)根据处理数据的类型不同,流可以分为两大类:
  字节流以字节(8位二进制)为单位进行处理。主要用于读写诸如图像或声音的二进制数据。
   字符流以字符(16位二进制)为单位进行处理。
  后缀是Stream是字节流,而后缀是Reader,Writer是字符流。
(2)按照功能分类:
  节点流:从特定的地方读写的流类,如磁盘或者一块内存区域。
  过滤流:使用节点流作为输入或输出。过滤流是使用一个已经存在的输入流或者输出流连接创建的。

2.Java Socket是什么

网络上两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一端称为一个socket。
Socket可以分为两种类型:面向连接的Socket通信协议(tcp)面向无连接的Socket通信协议(udp)。
典型的TCP客户端要经过下面三步操作:

  • 创建一个Socket实例:构造函数向指定的远程主机和端口建立一个TCP连接

  • 通过套接字的I/O流与服务端通信

  • 使用Socket类的close方法关闭连接
    Server端和Client端都可以通过Send、Write等方法与对方通信。

3.java NIO是什么

NIO(Nonblocking IO)
Java NIO 由以下几个核心部分组成:

  • Channels

  • Buffers

  • Selectors
    Channel 和 Buffer
      基本上,所有的 IO 在NIO 中都从一个Channel 开始。Channel 有点象流。 数据可以从Channel读到Buffer中,也可以从Buffer 写到Channel中。这里有个图示:
      在这里插入图片描述
      Channel和Buffer有好几种类型。下面是JAVA NIO中的一些主要Channel的实现:

  • FileChannel

  • DatagramChannel

  • SocketChannel

  • ServerSocketChannel

正如你所看到的,这些通道涵盖了UDP 和 TCP 网络IO,以及文件IO。
与这些类一起的有一些有趣的接口,但为简单起见,我尽量在概述中不提到它们。本教程其它章节与它们相关的地方我会进行解释。

以下是Java NIO里关键的Buffer实现:

  • ByteBuffer
  • CharBuffer
  • DoubleBuffer
  • FloatBuffer
  • IntBuffer
  • LongBuffer
  • ShortBuffer

这些Buffer覆盖了你能通过IO发送的基本数据类型:byte, short, int, long, float, double 和 char。
Selector
Selector允许单线程处理多个Channel,如果你的应用打开了多个连接(通道),但每个连接的流量都很低,使用Selector就会很方便。例如,在一个聊天服务器中。
Selector内部的实现原理:对所有注册的channel进行轮询访问,一旦轮询到一个channel1有注册的事件发生,通过selection-key的方式来通知开发人员对channel1进行数据的读写。这种轮询的方式在处理多线程请求时不需要上下文的切换。而采用多线程的实现方式需要在线程之间切换时需要上下文切换,同时需要进行压栈和弹栈操作,因此NIO效率较高。
java NIO和IO的主要区别

IONIO
面向流面向缓冲
阻塞非阻塞
选择器
4.什么是java 的序列化(串行化)?

简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。
什么情况下需要序列化?序列化的注意事项,如何实现java 序列化(串行化)?

  • 当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
  • 当你想用套接字在网络上传送对象的时候;
  • 当你想通过RMI传输对象的时候;
    序列化注意事项:
  • 如果子类实现Serializable接口而父类未实现时,父类不会被序列化,但此时父类必须有个无参构造方法,否则会抛InvalidClassException异常
  • 静态变量不会被序列化,那是类的“菜”,不是对象的。串行化保存的是对象的状态,即非静态的属性,即实例变量。不能保存类变量
  • transient关键字修饰变量可以限制序列化。对于不需要或不应该保存的属性,应加上transient修饰符。要串行化的对象的类必须是公开的(public)
  • 虚拟机是否允许反序列化,不仅取决于类路径和功能代码是否一致,一个非常重要的一点是两个类的序列化 ID是否一致,就是 privatestatic final long serialVersionUID = 1L
  • Java序列化机制为了节省磁盘空间,具有特定的存储规则,当写入文件的为同一对象时,并不会再将对象的内容进行存储,而只是再次存储一份引用。反序列化时,恢复引用关系
  • 序列化到同一个文件时,如第二次修改了相同对象属性值再次保存时候,虚拟机根据引用关系知道已经有一个相同对象已经写入文件,因此只保存第二次写的引用,所以读取时,都是第一次保存的对象
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值