java程序员面试(五)

输入输出流

  1. Java IO流的机制是什么?

    • 输入输出都被称为抽象的流,流可以被看作一组有序的字节集合,即数据在两设备之间的传输。
    • 流的本质是数据传输,根据处理数据的类型不同,流可以分为两大类:字节流和字符流。
    • 字节流以字节(8bit)为单位,包含两个抽象类:InputStream、OutputStream
    • 字符流已16bit为单位,根据码表映射字符,一次可以读多个字节,它包含两个抽象类:Reader输入流和Writer输出流。
    • Java IO类在设计师采用了Decorator装饰者设计模式。使用这一设计模式的好处是可以在运行时动态地给对象添加一些额外的职责,以使用继承的设计方法相比,该方法具有很好的灵活性。
  1. 管理文件和目录的类是什么

    • 对文件和目录进行管理与操作在编程中有着非常重要的作用,Java提供了一个非常重要的类File,来管理文件和文件夹。通过类不仅能够查看文件或目录的属性,而且还可以实现对文件或目录的创建、删除与重命等操作。
  2. Java Socket是什么

    • 网络上的两个程序通过一个双向通信连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket也称为套接字,可以用来实现不同虚拟机或不同计算机之间的通信。
    • 在Java语言中,Socket可以分为两种类型:面向连接的Socket通信协议TCP和面向无连接的通信协议UDP。
    • 任何一个Socket都是由IP地址和端口号唯一确定的。
    • 基于TCP的通信过程:首先Server段Listen指定某个端口是否有连接请求;其次客户端向Server发出Connect请求;最后Server段向Client段发出Accept消息。一个连接建立起来了,会话随即产生。Server端和Client端都可以通过send和Write等方法来进行通信。
    • Socket的生命周期可以分为三个阶段:打开Socket、使用Socket收发数据和关闭Socket。在java语言中可以使用ServerSocket来作为服务器端。Socket端作为客户端来实现网络通信。
  3. Java NIO是什么

    • 在非阻塞IO(Nonblocking IO ,NIO)出现之前,Java是通过传统的Socket来实现基本的网络通信功能的。
    • 传统的Socket通信时阻塞的,特别是多线程情况下,阻塞会导致线程的上下文切换,使得程序运行效率非常低。
    • NIO 通过Selector、Channel和Buffer来实现非阻塞的IO操作。
    • NIO非阻塞的实现主要采用了Reactor(反应器)设计模式,这个设计模式与Observer观察者设计模式类似,只不过Observer设计模式只能处理一个事件源,而Reactor设计模式可以用来处理多个事件源。
    • NIO在网络编程中有着非常重要的作用,与传统的Sokcet方式相比,由于NIO采用了非阻塞的方式,在处理大量并发请求时,使用NIO要比使用Socket效率高出很多。
  4. 什么时java序列化

    • java提供了两种对象持久化的方式,分别为序列化和外部序列化。
    • 序列化(Serialization) 在分布式环境下,当进行远程通信时,无论时何种类型的数据,都会以二进制序列的形式在网络上传送。序列化时一种将对象以一连串的字符描述的过程,用于解决在对对象流进行读写操作时所引发的问题。序列化可以将对象的状态写在流里进行网络传输,或者保存到文件、数据库系统里,并在需要时把该流读取出来重新构造一个相同的对象。
    • 实现序列化,所有要实现序列化的类都哦必须实现Serializable接口,Serializable接口位于java.lang包中,它里面没有包含任何方法。使用一个输出流来构造一个ObjectOutputStream(对象流)对象,紧接着 ,使用该对象的writeObject(Object obj)方法将obj对象写出,要恢复时可以使用其对应的输入流。
    • 序列化有以下两个特点: 如果一个类能被序列化 ,那么他的子类也能够被序列化。由于static代表类的成员,transient(Java语言关键字,如果用transient生命一个实例变量,当对象存储时,它的值不需要维护)代表对象的临时数据,因此被声明为这两种类型的数据成员是不能够被序列化的。
    • java提供了多个对象序列化的接口,包括ObjectOutput,ObjectInput,ObjectOutpuStream和ObjectInputStream
    • 由于序列化的使用会影响系统的性能,因此如果不是必须要使用序列化,应尽可能不要使用序列化。那么什么情况下需要使用序列化呢?
    • 需要通过网络来发送对象,或对象的状态需要被持久化到数据库或文件中。序列化能实现深复制,即可以复制引用的对象。
    • 与序列化相对的是反序列化,它将流转化为对象。在序列化和反序列化的过程中,serialVersionUID起着非常重要的作用,每个类都有一个特定的serialVersionUID,在反序列化的过程中,通过serialVersionUID来判定类的兼容性。如果待序列化的对象与目标对象serialVersionUID不同,那么反序列化时会抛出InvalidClassException异常。作为一个好的编程习惯,最好在被序列化的类中显示地声明serialVersionUID。
    • 自定义SerialVersionUID有如下3个优点:提高程序的运行效率、提高程序不同平台的兼容性、增强程序各个版本的可兼容性。
    • 外部序列化与序列化主要的区别时内置的API,只需要实现Serializable接口,开发人员不需要编写任何代码就可以实现对象的序列化。而使用外部的序列化时,Externalizable接口中的读写方法必须由开发人员来实现。
  5. System.out.println()方法使用时需要注意哪些问题

    • 放入对象,会调用toString方法
    • 内部字符串会拼接

本文链接:

https://heyzen.club/index.php/J/299.html
1 + 9 =
快来做第一个评论的人吧~