首页 > 编程语言 > 详细

2021年超详细的Java面试题及答案整理 - I/O面试题

时间:2021-04-23 16:43:56      阅读:28      评论:0      收藏:0      [点我收藏+]

技术分享图片

☆☆☆☆☆更多Java面试题汇总整理,点这里(包括:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Redis、MySQL、Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、Linux 等技术栈。)

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

从输入输出方面来讲: Java中有输入流和输出流

从流的编码方式上来讲: Java中有字节流和字符流

对于字节流而言:主要继承的抽象类为 InputStream和OutputStream

对于字符流而言:主要继承的抽象类为 InputStreamReader和OutputStreamReder

2. 写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数。

public int countWords(String file, String find) throws Exception {
int count = 0;
Reader in = new FileReader(file);
int c;
while ((c = in.read()) != -1) {
while (c == find.charAt(0)) {
for (int i = 1; i < find.length(); i++) {
c = in.read();
if (c != find.charAt(i)){
break;
}
if (i == find.length() - 1){
count++;
}
}
}
}
return count;
}

3. Java 中怎么创建 ByteBuffer?

byte[] bytes = new byte[10];

ByteBuffer buf = ByteBuffer.wrap(bytes);

4. 说出 5 条 IO 的最佳实践(答案)

IO 对 Java 应用的性能非常重要。理想情况下,你不应该在你应用的关键路径上

避免 IO 操作。下面是一些你应该遵循的 Java IO 最佳实践:

1、使用有缓冲区的 IO 类,而不要单独读取字节或字符。

2、使用 NIO 和 NIO2

3、在 finally 块中关闭流,或者使用 try-with-resource 语句。

4、使用内存映射文件获取更快的 IO。

5. Java 中 IO 流分为几种?

按功能来分:输入流(input)、输出流(output)。

按类型来分:字节流和字符流。

字节流和字符流的区别是:字节流按 8 位传输以字节为单位输入输出数据,字符流按 16 位传输以字符为单位输入输出数据。

6. 谈谈Java IO里面的常见类,字节流,字符流、接口、实现类、方法阻塞

输入流就是从外部文件输入到内存,输出流主要是从内存输出到文件。
IO里面常见的类,第一印象就只知道IO流中有很多类,IO流主要分为字符流和字节流。

字符流中有抽象类InputStream和OutputStream,它们的子类FileInputStream,FileOutputStream,BufferedOutputStream等。

字符流BufferedReader和Writer等。都实现了Closeable, Flushable, Appendable这些接口。程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。
java中的阻塞式方法是指在程序调用改方法时,必须等待输入数据可用或者检测到输入结束或者抛出异常,否则程序会一直停留在该语句上,不会执行下面的语句。比如read()和readLine()方法。

7. 字符流和字节流有什么区别?

字节流用于操作包含ASCII字符的文件。JAVA也支持其他的字符如Unicode,为了读取包含Unicode字符的文件,JAVA语言引入了字符流。ASCII作为Unicode的子集,对于英语字符的文件,可以使用字节流也可以使用字符流。

8. 字节流和字符流,你更喜欢哪一个?

更喜欢使用字符流。许多在字符流中存在的特性,字节流中不存在。比如使用BufferedReader而不是BufferedInputStream或DataInputStream,它其中包含一个readLine() 方法用于读取文本行;又比如BufferedWriter流中有一个独特的向文件写入一个换行符的方法‘newLine()’用来读取下一行,但是在字节流中我们需要做额外的操作。

9. System.out.println()是什么?

println是PrintStream的一个方法。out是一个静态PrintStream类型的成员变量,System是一个java.lang包中的类,用于和底层的操作系统进行交互。

10. 什么是Filter流?

1、Filter Stream是一种IO流。
2、Filter流的主要作用是:对存在的流增加一些额外的功能,像给目标文件增加源文件中不存在的行数,或者增加拷贝的性能。

Filter Stream是一种IO流。Filter流的主要作用是:对存在的流增加一些额外的功能,像给目标文件增加源文件中不存在的行数,或者增加拷贝的性能。在java.io包中主要由4个可用的filter Stream组成。两个字节filter stream,两个字符filter stream。分别是:FilterInputStream、FilterOutputStream、FilterReader和FilterWriter。

11. 有哪些可用的Filter流?

在java.io包中主要由4个可用的filter Stream组成。两个字节filter stream,两个字符filter stream。分别是:FilterInputStreamFilterOutputStreamFilterReaderFilterWriter

12. 有哪些Filter流的子类?

1、 LineNumberInputStream:给目标文件增加行号。
2、DataInputStream:有些特殊的方法如:readInt()、readDouble()和readLine()等可以一次性的读取一个int, double和一个string类型的数据。
3、BufferedInputStream:增加性能。
4、PushbackInputStream:推送要求的字节到系统中。

13. 在文件拷贝的时候,哪一种流可用于提升更多的性能?

1、在字节流的时候,使用BufferedInputStream和BufferedOutputStream。
2、在字符流的时候,使用BufferedReader和BufferedWriter。

14. Java中流类的超类均为抽象类)主要由哪些组成?

1、java.io.InputStream(字节输入流)
2、java.io.OutputStream(字节输出流)
3、java.io.Reader(字符输入流)
4、java.io.Writer(字符输出流)

15. FileInputStream和FileOutputStream是什么?

1、这是在拷贝文件操作的时候,经常用到的两个类。
2、在处理小文件的时候,它们的性能表现还不错,在大文件的时候,最好使用BufferedInputStream(或BufferedReader)和BufferedOutputStream(或BufferedWriter

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

关于Java中的IO,网络通讯模型主要分三种:IO、NIO和AIO。

技术分享图片

适用场景:

BIO,适用于连接较少,对服务器资源消耗很大,但是编程简单。是同步阻塞的。
举例:你到餐馆点餐,然后在那儿等着,什么也做不了,只要饭还没有好,就要必须等着
NIO,使用于连接数量比较多且连接时间比较短的架构,比如聊天服务器,编程比较复杂。是同步非阻塞的
举例:你到餐馆点完餐,然后就可以去玩儿了,玩一会儿就回饭馆问一声,饭好了没。
AIO,适用于连接数量多而且连接时间长的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂。是异步非阻塞的。
举例:饭馆打电话给你说,我们知道你的位置,待会儿给您送来,你安心的玩儿就可以了。类似于外卖。

1、IO(同步阻塞)

传统的网络通讯模型,就是BIO,同步阻塞IO, 其实就是服务端创建一个ServerSocket, 然后就是客户端用一个Socket去连接服务端的那个ServerSocket, ServerSocket接收到了一个的连接请求就创建一个Socket和一个线程去跟那个Socket进行通讯。接着客户端和服务端就进行阻塞式的通信,客户端发送一个请求,服务端Socket进行处理后返回响应,在响应返回前,客户端那边就阻塞等待,上门事情也做不了。 这种方式的缺点, 每次一个客户端接入,都需要在服务端创建一个线程来服务这个客户端,这样大量客户端来的时候,就会造成服务端的线程数量可能达到了几千甚至几万,这样就可能会造成服务端过载过高,最后崩溃死掉。

2、NIO(同步非阻塞,JDK1.4)

NIO是一种同步非阻塞IO, 基于Reactor模型来实现的。其实相当于就是一个线程处理大量的客户端的请求,通过一个线程轮询大量的channel,每次就获取一批有事件的channel,然后对每个请求启动一个线程处理即可。这里的核心就是非阻塞,就那个selector一个线程就可以不停轮询channel,所有客户端请求都不会阻塞,直接就会进来,大不了就是等待一下排着队而已。这里面优化BIO的核心就是,一个客户端并不是时时刻刻都有数据进行交互,没有必要死耗着一个线程不放,所以客户端选择了让线程歇一歇,只有客户端有相应的操作的时候才发起通知,创建一个线程来处理请求。

3、AIO(NIO2,异步非阻塞,JDK1.7)

对于NIO来说,我们的业务线程是在IO操作准备好时,得到通知,接着就由这个线程自行进行IO操作,IO操作本身是同步的。但是对AIO来说,则更加进了一步,它不是在IO准备好时再通知线程,而是在IO操作已经完成后,再给线程发出通知。因此AIO是不会阻塞的,此时我们的业务逻辑将变成一个回调函数,等待IO操作完成后,由系统自动触发。

与NIO不同,当进行读写操作时,只须直接调用API的read或write方法即可。这两种方法均为异步的,对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序。 即可以理解为,read/write方法都是异步的,完成后会主动调用回调函数。 在JDK1.7中,这部分内容被称作NIO.2,主要在Java.nio.channels包下增加了下面四个异步通道:

  • AsynchronousSocketChannel

  • AsynchronousServerSocketChannel

  • AsynchronousFileChannel

  • AsynchronousDatagramChannel

AIO是异步非阻塞IO,基于Proactor模型实现。 每个连接发送过来的请求,都会绑定一个Buffer,然后通知操作系统去完成异步的读,这个时间你就可以去做其他的事情,等到操作系统完成读之后,就会调用你的接口,给你操作系统异步读完的数据。这个时候你就可以拿到数据进行处理,将数据往回写,在往回写的过程,同样是给操作系统一个Buffer,让操作系统去完成写,写完了来通知你。这俩个过程都有buffer存在,数据都是通过buffer来完成读写。,

17. 讲讲NIO

看了一些文章,传统的IO流是阻塞式的,会一直监听一个ServerSocket,在调用read等方法时,他会一直等到数据到来或者缓冲区已满时才返回。

调用accept也是一直阻塞到有客户端连接才会返回。每个客户端连接过来后,服务端都会启动一个线程去处理该客户端的请求。并且多线程处理多个连接。每个线程拥有自己的栈空间并且占用一些 CPU 时间。每个线程遇到外部未准备好的时候,都会阻塞掉。阻塞的结果就是会带来大量的进程上下文切换。
对于NIO,它是非阻塞式,核心类:
1、Buffer为所有的原始类型提供 (Buffer)缓存支持。
2、Charset字符集编码解码解决方案
3、Channel一个新的原始 I/O抽象,用于读写Buffer类型,通道可以认为是一种连接,可以是到特定设备,程序或者是网络的连接。

18. Files的常用方法都有哪些?

  • Files. exists():检测文件路径是否存在。
  • Files. createFile():创建文件。
  • Files. createDirectory():创建文件夹。
  • Files. delete():删除一个文件或目录。
  • Files. copy():复制文件。
  • Files. move():移动文件。
  • Files. size():查看文件个数。
  • Files. read():读取文件。
  • Files. write():写入文件。

19. Java 中 IO 流分为几种?

  • 按照流的流向分,可以分为输入流和输出流;
  • 按照操作单元划分,可以划分为字节流和字符流;
  • 按照流的角色划分为节点流和处理流。

Java Io 流共涉及 40 多个类,这些类看上去很杂乱,但实际上很有规则,而且彼此之间存在非常紧密的联系, Java I0 流的 40 多个类都是从如下 4 个抽象类基类中派生出来的。

  • InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
  • OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。

按操作方式分类结构图:

技术分享图片

20. 常见的NIO框架有哪些

1、Mina

Mina是 Apache组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的 Mina 版本2.04支持基于 JavaNIO 技术的 TCP/UDP 应用程序开发、串口通讯程序,Mina 所支持的功能也在进一步的扩展中。

2、Netty

Netty是一款异步的事件驱动的网络应用框架和工具,用于快速开发可维护的高性能、高扩展性协议服务器和客户端。也就是说,Netty是一个NIO客户端/服务器框架,支持快速、简单地开发网络应用,如协议服务器和客户端。它极大简化了网络编程,如TCP和UDP套接字服务器。

3、Grizzly

Grizzly是一种应用程序框架,专门解决编写成千上万用户访问服务器时候产生的各种问题。使用JAVANIO作为基础,并隐藏其编程的复杂性。容易使用的高性能的API。带来非阻塞socketd到协议处理层。利用高性能的缓冲和缓冲管理使用高性能的线程池。

21. Java IO 中的设计模式?(重点)

重点是用到两个设计模式:装饰模式和适配器模式。

装饰模式:在由InputStream、OutputStream、Reader和Writer代表的等级结构内部,有一些流处理器可以对另一些流处理器起到装饰作用,形成新的、具有改善了的功能的流处理器。
适配器模式:在由InputStream、OutputStream、Reader和Writer代表的等级结构内部,有一些流处理器是对其他类型的流处理器的适配,这就是适配器的应用。

22. 在文件拷贝的时候,哪一种流可用于提升更多的性能?

  • 在字节流的时候,使用BufferedInputStream和BufferedOutputStream。
  • 在字符流的时候,使用BufferedReader和BufferedWriter。

23. 说说管道流(Piped Stream)

  • 有四种管道流:PipedInputStreamPipedOutputStreamPipedReaderPipedWriter
  • 在多个线程或进程中传递数据的时候管道流非常有用。

24. 说说File类

  • 它不属于IO流,也不是用于文件操作的。
  • 它主要是用于获取一个文件的属性、读写权限、大小等信息

25. 说说RandomAccessFile?

  • 它在java.io包中是一个特殊的类,既不是输入流也不是输出流,它两者都可以做到。
  • 它是Object的直接子类。通常来说,一个流只有一个功能,要么读,要么写。但是RandomAccessFile类既可以读文件,也可以写文件。
  • DataInputStream和DataOutputStream有的方法,在RandomAccessFile中都存在。

☆☆☆☆☆更多Java面试题汇总整理,点这里(包括:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Redis、MySQL、Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、Linux 等技术栈。)

2021年超详细的Java面试题及答案整理 - I/O面试题

原文:https://www.cnblogs.com/ebooklist/p/14693402.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!