MO_or的Java IO流复习总结

一、引言

本篇文章主要记录关于IO的基础知识与面试问题

二、总结

1.什么是IO流,Java IO中重要的5个类以及一个接口?

1)它是一种将数据流从源头流到目的地。比如文件拷贝,就包括了输入(复制)输出(粘贴)流
2)主要包括File、InputStream、OutputStream、Reader、Writer五大类,Serialize接口

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

1)两种,字节流,字符流
2)字节流为:InputStream、OutputStream
3)字符流为:Reader、Writer

3.字节流和字符流哪个好?怎么选择?

1)若传输的资源为:图片、视频、音频等,按字节排列的资源,字节流相对更好
2)若传输的资源为:字符串、汉字等,按字符排列的资源,字符流相对更好

4.什么是缓冲区?有什么作用?

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

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

1)字节流和字符流的使用大部分非常相似,字节流是直接操作文件本身的不经过缓冲区,
  但字符流的操作全部是经过缓冲区的,所以若不使用close(),是不会输出任何内容的,
  同时也可以使用flush()来强制刷新缓冲区,以达到不使用close()也能够输出内容
2)字节流处理的是字符、字符数组和二进制对象
  字符流处理的是字符、字符数组和字符串

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

1)将一个对象表示为一个字节序列,可以对序列化的对象进行读写操作,
  比如将该序列化对象写入文件中,再从文件中读取出来,反序列化该对象
  因为此过程是在JVM中进行的,所以可以实现在一个平台序列化的对象,在另一个完全不同的平台反序列化该对象
2)在需要序列化的类上实现接口Serialize接口,没有需要实现的方法,此接口只是标识对象可被序列化,
  然后使用一个输出流(如:FileOutputStream)来构造一个对象流(如:ObjectOutputStream)对象,再调用对象流对象
  的writeObject(Obj obj)就可以将参数obj进行输出

7.BufferedReader属于哪种流,它主要是用来做什么的,它里面有那些经典的方法?

1)属于处理流中的缓冲流
2)可以将读取的内容存入内存中
3)readLine(),用于读取一行    

8.什么是节点流,什么是处理流,它们各有什么用处,处理流的创建有什么特征?

1)节点流直接与数据源相连,进行输入输出
2)处理流是在节点流的基础上进行加工,扩展其功能
3)处理流的创建必须在构造器中传入节点流的子类

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

1)需要关闭,因为IO流比较占用资源,使用close()方法
2)一般在finally代码块里,因为通常来说不管代码是否被try-catch,finally都会执行
3)处理流也是使用close()方法关闭流
4)流的关闭顺序一般是,先使用后关闭,后使用先关闭,如果是使用处理流依赖节点流,就是先关闭处理流,再关闭节点流
  也可以只关闭处理流,处理流关闭时会调用节点流的关闭方法

10.InputStream里的read()返回的是什么,read(byte[] data)是什么意思,返回的是什么值?

1)返回所读取的字节的int型,范围-1~255(源码中用@Range(from=-1,to=255)),
  若未读取到内容则返回-1
2)将所读取的字节放入data字节数组中,返回的是读取到data字节数组的字节个数
PS:read0()源码中涉及到一个关键词,native,这是用来声明与底层C语言代码相关

11.OutputStream里面的write()是什么意思,write(byte b[], int off, int len)这个方法里面的三个参数分别是什么意思?

1)将指定字节写入数据源
2)byte b[]是指定写入数据源的字节数组,字符串可以使用方法getBytes()来转换成字节数组,
  getBytes()中也可以指定写入时的字符编码,默认为ISO-8859-1
  int off,是指定写入字节的起始位置
  int len,是指定写入字节的结束位置,如写入字节为"hello world",int off为1,int len为5,则写入的为"ello",
  即左闭右开     

三、参考

https://zhuanlan.zhihu.com/p/...

https://www.cnblogs.com/huang...

https://blog.csdn.net/qq_3787...

四、最后

作为新人程序员,深知自己与同行间的差距。所以非常欢迎大家在评论区指出文章中的不足之处。MO_or定及时纠正。

你可能感兴趣的:(java,java-se,io,基础,总结)