一、引言
本篇文章主要记录关于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定及时纠正。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。