首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Java面试必问之IO流基础”精彩不容错过,精心整理“

Java面试必问之IO流基础”精彩不容错过,精心整理“

作者头像
@派大星
发布2023-06-28 10:52:35
发布2023-06-28 10:52:35
2570
举报
文章被收录于专栏:码上遇见你码上遇见你

Java之IO流常见面试题

  1. Java中有几种类型的流?
  • 字节流和字符流
  • 字节流继承inputStream和OutputStream
  • 字符流继承InputStreamReader和OutPutStream.
  • 总体结构图:

2:字节流和字符流哪个好怎么选择?

  1. 绝大多数情况下使用字节流比较好,因为字节流是字符流的包装,而大多数IO都是直接操作磁盘文件,所以这些流在传输时都是以字节的方式进行传输(图片等都是按照字节存储的);
  2. 如果对于操作需要通过IO在内存中频繁处理字符串的情况下使用字符流会好一些,因为字符流具备一些缓冲区,从而提高了性能.

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

  • 字节流和字符流使用非常相似,但实际上字节流的操作不会经过缓冲区(内存)而是直接操作文件本身的,而字符流的操作会经过缓冲区(内存)然后通过缓冲区在操作文件.

4:什么时候字节流,什么是处理流,它们各有什么用处,处理流的创建有什么特征?

  • 节点流:直接与数据源相连,用于输入或输出.
  • 处理流:在节点流的基础上对之进行加工,进行一些功能的扩展.
  • 处理流的构造器必须要传入节点流的子类

5:流一般需不需要关闭,如果关闭的话用什么方法,一般要在哪个代码块中关闭比较好,处理流是怎么关闭的,如果有多个流互相调用传入是怎么关闭的?

  • 流一旦打开就必须关闭,使用close方法.
  • 放入finally语句块中(finally语句一定会执行)
  • 调用的处理流就关闭处理流
  • 多个流互相调用就关闭最外层的流

什么是缓冲区?

  1. 缓冲区就是一段特殊的内存区域,很多情况下当内存需要频繁的操作一个资源时(如文件或数据库)则性能会很低,所以为了提升性能就可以将一部分数据暂时读写到缓冲区,以后从此区域中读写数据即可,这样显著提高了性能.
  2. 对于Java字符流的操作都是在缓冲区进行操作的,所以如果我们想在字符流操作中主动将缓冲区刷新到文件则可以使用flush()方法操作.

简述JAVA中I/O和NIO的区别?

代码语言:javascript
复制
NIO:是一种new IO,其目的是为了实现高速IO的代码,将IO操作并转换为操作系统,属于非阻塞型,java.nio.*,是以块(缓冲区)的形式就行数据的传输
IO:是以流的方式就行数据的传输,属于阻塞型,影响程序的性能

传统阻塞IO,如果你要read/write( byte[10M])一个10M的文件,一旦调用了read/write( byte[10M])这个方法,就得等10M全部read/write,方法底层才会返回。

非阻塞线程,调用read/write( byte[10M])方法立即返回,当然这并不能代表10M已经read/write完成,你需要检测这个byte[10M]的缓冲区

java BIO:同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善;

java NIO:同步非阻塞,服务器实现模式为一个请求一个线程,NIO多线程对某资源进行IO操作时会先把资源先操作至内存缓冲区。然后询问是否IO操作就绪,是则进行IO操作,否则进行下一步操作,然后不断的轮询是否IO操作就绪,直到iIO操作就绪后进行相关操作

java AIO:异步非阻塞,异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。

BIO和NIO的异同:

    共同点:两者都是同步操作。即必须先进行IO操作后才能进行下一步操作。
    不同点:BIO多线程对某资源进行IO操作时会出现阻塞,即一个线程进行IO操作完才会通知另外的IO操作线程,必须等待。
  1. 什么是Java序列化,如何实现Java序列化? 序列化就是一种用来处理对象流的机制.将对象的内容进行流化.可以对流化的对象进行读写操作,可以将流化后的对象传输于网络之间.序列化就是为了解决在对象流读写操作时所引发的问题。 序列化的实现:将需要序列化的类实现Serialize接口,没有需要实现的方法,此接口只是为了标注对象可被序列化的,然后使用一个输出流(FileOutOutStream)来构造一个ObjectOutPutStream(对象流)对象,在使用ObjectOutputStream的对象的write(Object obj)方法就可以将参数obj对象写出.
  2. PrintStream、BufferedWriter、PrintWriter的比较? 1:PrintStream类的输出功能非常强大,通常需要输出文本内容,都应该将输出流包装成PrintStream后进行输出。它还提供其他两项功能。与其他输出流不同,PrintStream永远不会抛出IOException;而是,异常情况仅设置可通过checkerror方法测试的内部标志.另外,为了自动刷新,可以创建一个PrintStream 2:BufferedWriter:将文本写入字符输出流,缓冲各个字符从而提供单个字符,数组和字符串的高效写入.通过write()方法可以将获取到的字符输出.然后通过newline()进行换行操作.BufferedWriter中的字符必须通过flush()方法才能将其刷出去;并且BufferedWriter只能对字符进行操作,如果要对字节流进行操作,则需要使用BufferedInputStream 3:PrintWriter的println方法自动添加换行,不会抛出异常,若关心异常,则需要调用checkError方法看是否有异常发生,PrintWriter构造方法可构造指定参数,实现自动刷新缓存(autoFlush).
  3. BufferedReader属于哪种流,它主要是用来做什么的,它里面有哪些经典的方法? 属于处理流中的缓冲流,可以将读取的内容放在内存中,有readLine()方法。它用来读取一行。
  4. InputStream里的read()返回的是什么,read(byte[] data)是什么意思,返回的是什么值? 返回的是所读取的字节int类型(范围0-255) read(byte[] data)将读取的字节存储在这个数组。返回的就是传入数组参数个数.
  5. OutputStream里面的write()是什么意思,write(byte b[],int off,int len)这个方法里面的三个参数分别是什么意思? 1:write指定字传入数据源 2:byte b[] 是byte数组 3:b[off]是传入的第一个数组、b[off+len-1]是传入的最后一个字符、len是实际长度.
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码上遇见你 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档