java中IO流的基础知识,以及常见的面试题

一、本文简介

  我们之前学习的java知识点中,有一个模块针对于文件的复制和存储都非常便捷,面试时也是频繁的会遇到,那就是IO流。本篇对IO流一些常见的基础知识点和常见的面试题进行了整理。

二、java中IO流需掌握的基本概念

  1、什么是流
   &emsp“流”是一个抽象的概念,它是对输入输出设备的一种抽象理解,在java中,对数据的输入输出操作都是以“流”的方式进行的。数据以二进制的形式在程序与设备之间流动传输。“流”具有方向性,输入流、输出流是建立在内存(将硬盘数据读入内存的过程交输入、将内存中数据写到硬盘的过程叫输出)概念之上的,并且方向是相对的。当程序需要从数据源中读入数据的时候就会开启一个输入流,相反,写出数据到某个数据源目的地的时候也会开启一个输出流。数据源可以是文件、内存或者网络等。

  2、流的分类
  (1)按数据流向分类:
   输入流:把数据从其他设备上读取到程序中的流
   输出流:把数据从程序中写到其他设备上的流
  (2)按数据类型分类:
   字节流:以字节为单位,读写数据的流,字节流按照8位传输。
   字符流:以字符为单位,读写数据的流,字符流按照16位传输。
  (3)按处理的方式分:
   节点流
    可以【直接】读取某一个地方的数据,或者【直接】把数据写入到某一个地方。
    举例:字节流,字符流
   处理流
    不能【直接】从某一个地方读数据或写数据,它们每一种都有一些特殊的功能,例如有的可以自动转换基本类型数据为字节,有的可以提高其他流的读写效率,有的可以将字节流转为字符流,有的可以把对象转为字节等。
    举例:数据流,缓冲流,转换流,对象流,随机访问流。

  3、java中IO流继承关系
   (1)InputStream(字节输入流)和OutputStream(字节输出流)的继承关系图
在这里插入图片描述
   (2)Reader(字符输入流)和Writer(字符输出流)的继承关系图
在这里插入图片描述

三、常见的IO面试

1、文件copy的过程:
  其实使用FileInputStream和FileOutputStream复制文件和FileReader和FileWriter复制文件从本质上来说是相同的,因为过程如下图所示:
在这里插入图片描述
2、输入流和输出流联系和区别,节点流和处理流联系和区别
  首先,你要明白什么是“流”。直观地讲,流就像管道一样,在程序和文件之间传输数据,输入输出的方向是针对程序而言,向程序中读入东西,就是输入流,从程序中向外读东西,就是输出流。
  输入流是得到数据,输出流是输出数据,
  节点流,处理流是流的另一种划分,按照功能不同进行的划分。节点流,可以从或向一个特定的地方(节点)读写数据。
  处理流是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader。处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,

3、字节流如何转为字符流
  字节输入流转字符输入流通过 InputStreamReader 实现,该类的构造函数可以传入 InputStream 对象。
  字节输出流转字符输出流通过 OutputStreamWriter 实现,该类的构造函数可以传入 OutputStream 对象。

4、字节流与字符流的区别
  以字节为单位输入输出数据,字节流按照8位传输
  以字符为单位输入输出数据,字符流按照16位传输

5、说明缓冲流的优点和原理
  (1)不带缓冲的流的工作原理:
  它读取到一个字节/字符,就向用户指定的路径写出去,读一个写一个,所以就慢了。
  (2)带缓冲的流的工作原理:
  读取到一个字节/字符,先不输出,等凑足了缓冲的最大容量后一次性写出去,从而提高了工作效率
  优点:减少对硬盘的读取次数,降低对硬盘的损耗。
6、什么是 java 序列化
  序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。

7、序列化的实现和注意事项
  实现和注意事项:
  (1)实现接口Serializable Serializable接口中没有任何的方法,实现该接口的类不需要实现额外的方法。 implements Serializable 只是为了标注该对象是可被序列化的。
  (2)如果对象中的某个属性是对象类型,必须也实现Serializable接口才可以,序列化对静态变量无效。
  (3)如果不希望某个属性参与序列化,不是将其static,而是transient串行化保存的只是变量的值,对于变量的任何修饰符,都不能保存序列化版本不兼容 。

8、什么是序列化和反序列化
  对象序列化,将对象以二进制的形式保存在硬盘上
  反序列化;将二进制的文件转化为对象读取

9、在实现序列化接口是时候一般要生成一个serialVersionUID字段,它叫做什么,一般有什么用?
  名称:serialVersionUID用作Serializable类中的版本控件,又称版本号
  生成过程:进行序列化操作时,如果没有手动进行声明的话。jvm会默认声明serialVersionUID=1L。
  作用:serialVersionUID的唯一值判定其为同一个对象。保证序列化的正常进行。serialversionuid的作用是验证对象版本的一致性。如果serialversionuid一致,说明他们的版本是一样的,可以进行反序列化。反之,就说明版本不同,就无法进行对象的反序列化。

10、简述File类的基本功能
  处理文件和获取文件信息,文件或文件夹的管理
  除了读写文件内容其他的都可以做

11、说说BIO、NIO和AIO的区别
  (1)BIO、NIO和AIO介绍
   Java BIO: 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
   Java NIO: 同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
   Java AIO: 异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。
  (2)三者区别、对比
   NIO比BIO的改善之处是把一些无效的连接挡在了启动线程之前,减少了这部分资源的浪费(因为我们都知道每创建一个线程,就要为这个线程分配一定的内存空间)
   AIO比NIO的进一步改善之处是将一些暂时可能无效的请求挡在了启动线程之前,比如在NIO的处理方式中,当一个请求来的话,开启线程进行处理,但这个请求所需要的资源还没有就绪,此时必须等待后端的应用资源,这时线程就被阻塞了。
  (3)适用场景分析:
   BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解,如之前在Apache中使用。
   NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持,如在 Nginx,Netty中使用。
   AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持,在成长中,Netty曾经使用过,后来放弃。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值