2019年最新Java面试宝典:Java IO篇

时间:2020-02-10 来源:www.adxplorer.com.cn

许多学生想知道企业在招聘Java工程师时会问什么问题。前锋广州爪哇培训老师总结了以往所有学生的求职经历,与企业沟通后,总结出《Java面试宝典》,涵盖爪哇基础、设计模式、春季mvc等检查点。让我们一起来看看。

1中的公共类。输入输出、字节流、字符流、接口、实现类、方法阻塞?

输入流从外部文件输入内存,输出流主要从内存输出到文件。

IO中常见的类,第一印象是在IO流中有许多类。输入输出流主要分为字符流和字节流。字符流中有抽象类输入流(InputStream)和输出流(OutputStream),它们的子类有文件输入流、文件输出流、缓冲输出流等。字符流缓冲器恐惧者和作家等。所有这些都实现了可关闭、可冲洗、可追加的接口。程序中的输入和输出都以流的形式保存,流中保存的实际上都是字节文件。

java中的Blocking method意味着当程序调用更改方法时,它必须等待输入数据可用,或者检测到输入的结束或抛出异常,否则程序将停留在语句上,不会执行以下语句。例如,read和readLine方法。

2。谈NIO的认知?

对于NIO,它是非阻塞的,核心类:

1。缓冲区为所有原始类型提供缓冲区缓存支持。

2。字符集字符集编码和解码解决方案

3。通道读写缓冲区类型的新的原始输入输出抽象。信道可以被认为是到特定设备、程序或网络的连接。

3。字节流和字符流有什么区别?

字符流和字节流的用法非常相似,但实际上字节流的操作并不通过缓冲区(内存),而是直接操作文本本身,字符流的操作将首先通过缓冲区(内存),然后以字节为单位操作文件

输入输出数据,字节流以8位

输入输出数据为单位传输,字符流以16位

4.NIO传输,传统IO有什么区别?

1。传统的输入输出通常是一个等待连接的线程,它在连接后被分配给处理器线程。当处理器线程连接到一个通道时,如果该通道没有数据,它将阻塞(线程被动挂起),并且不能做任何其他事情。NIO是不同的。首先,不感兴趣的事件已经在选择器线程的轮询过程中被过滤掉。第二,处理器中处理感兴趣事件的读写是非阻塞操作,即直接返回,线程不被挂起。

2。传统io的管道是单向的,nio的管道是双向的。

3,两者都是同步的,也就是说,java程序负责读写数据。传统io和nio都需要读写方法,这些方法由java程序调用,而不是由系统调用。nio2.0改进了这一点,也就是说,异步非阻塞异步有四个类用于处理。

5。生物技术与NIO和AIO有什么区别和应用场景?

同步:java自己处理io。

异步:java将io提供给操作系统进行处理,告诉缓冲区大小,处理完成回调。

阻塞:当使用阻塞输入输出时,在读和写完成之前,Java调用不会返回。

非阻塞:当使用非阻塞输入输出时,如果不能立即读写,Java调用将立即返回。当IO事件分发器通知您可以读写时,您正在读写,并继续循环,直到读写完成。

BIO:同步和阻止。服务器实现模式是一次连接一个线程。这种模式的一个明显缺陷是,由于客户端连接的数量与服务器线程的数量成比例,在严重情况下,可能会导致不必要的线程开销和服务器内存溢出。当然,这种情况可以通过线程池机制得到改善,但是它不能从本质上消除这个缺点。

NIO:在JDK1.4之前,Java的输入输出模型一直是BIO,但是自从JDK1.4之后,JDK引入了一个新的同步的、非阻塞的输入输出模型NIO。然而,服务器的实现模式是为多个请求请求一个线程,也就是说,该请求将被注册到多路复用器选择器,并且多路复用器仅在轮询输入输出请求时才开始一个线程处理。

AIO: JDK 1.7

6.什么是Java序列化,如何实现Java序列化?

序列化是一种用于处理对象流、流对象内容的机制。流对象可以被读取和写入,并且流对象可以在网络之间传输。序列化(Serialization)是为了解决对象流

Serialization Implementation的读写操作引起的问题:序列化要序列化的类,没有实现的方法,这个接口只是为了标记对象可以序列化,然后使用输出流(如FileOutputStream)来构造ObjectOutputStream对象。使用objectOutputStream对象的write(对象对象对象)方法,可以写出

7的比较结果。参数为Obj的对象的打印流、缓冲区写入器和打印器?

PrintStream类具有非常强大的输出功能。通常,如果您需要输出文本内容,您应该将输出流包装到PrintStream中并输出它。它还提供了另外两个功能。与其他输出流不同,PrintStream从不抛出IOException相反,异常只设置可以由checkError方法测试的内部标志。此外,为了自动刷新,可以创建PrintStream

2和BufferedWriter:将文本写入字符输出流,并缓冲每个字符,以提供单个字符、数组和字符串的高效写入。写入方法可用于输出获得的字符,然后换行符可用于换行操作。缓冲区写入器中的字符流必须通过调用flush方法清除。缓冲区写入器只能对字符流进行操作。如果要对字节流进行操作,请使用BufferedInputStream

3和PrintWriter的println方法自动添加换行符,而不抛出异常。如果您关心异常,您需要调用checkError方法来查看是否有异常。PrintWriter构造方法可以指定参数来实现自动刷新。

8。什么是节点流,什么是处理流,它们有什么好处,以及处理流创建的特点是什么?

node flow直接连接到数据源,用于输入或输出

processing flow:基于节点流,对其进行处理以扩展一些功能。

processing flow的构造函数必须传递到节点流的子类

9中。什么是io流?

这是从源到目的地的数据流。例如,包括文件副本、输入流和输出流。输入流从文件中读取数据并将其存储到进程中,输出流从进程中读取数据并将其写入目标文件。

10。有哪些过滤流可用?

Java . io包中主要有4个过滤流。两字节过滤流,两个字符过滤流。它们是filterinputstream、filteroutputstream、filterreader和filterwriter。这些类是抽象的,不能实例化。

11.Java有多少种溪流?

根据流向:输入流和输出流。

根据实现的功能:节点流(数据可以从特定位置(节点)读写)。例如文件阅读器(FileReader))和处理流(它是现有流的连接和封装,数据读写是通过封装流的函数调用来实现的。例如,缓冲恐惧者。处理流程的构造方法总是以另一个流程对象为参数。一个流对象通过其他流的多个包装器,称为流链接。)

根据处理数据的单位:字节流和字符流。字节流从输入流和输出流继承,字符流从输入流读取器和输出流写入器继承。

12。如何实现对象克隆?

有两种方式:

1)。实现可克隆接口,并覆盖对象类中的克隆方法;

2)。实现可序列化接口,通过对象的序列化和反序列化实现克隆,实现真正的深度克隆

13。什么是缓冲?效果如何?

buffer是一个特殊的内存区域。在许多情况下,当程序需要频繁操作资源(如文件或数据库)时,性能会非常低。因此,为了提高性能,可以将一些数据临时读写到缓冲区,然后直接从该区读写数据,从而显着提高性能。Java字符流的所有操作都是在缓冲区中执行的,所以如果我们想在字符流操作中将缓冲区主动刷新到文件中,我们可以使用flush方法。

14。什么阻碍了输入输出?什么是无阻塞输入输出?

输入输出操作包括:读写硬盘、插座和外围设备。

当用户线程启动一个输入输出请求操作时(本文以一个读请求操作为例),内核将检查要读取的数据是否准备好。对于阻塞输入输出,如果数据没有准备好,它将在那里等待,直到数据准备好。对于非阻塞输入输出,如果数据没有准备好,将返回一个标志消息,通知用户线程当前要读取的数据没有准备好。当数据准备就绪时,数据被复制到用户线程,从而完成完整的输入输出读请求操作,也就是说,完整的输入输出读请求操作包括两个阶段:

1)检查数据是否准备就绪;

2)复制数据(内核将数据复制到用户线程)。

那么阻塞输入输出和非阻塞输入输出的区别在于第一阶段。如果数据没有准备好,在检查数据是否准备好的过程中是等待还是直接返回标志消息。

Java中的传统输入输出是阻塞输入输出,例如通过套接字读取数据。调用read方法后,如果数据没有准备好,当前线程将总是在read方法调用时阻塞,直到有数据要返回。如果是非阻塞输入输出,当数据没有准备好时,读取方法应该返回一个标志消息,通知当前线程数据没有准备好,而不是一直在那里等待。