java面试-io操作
(1)java中有几种类型的流?
字符流和字节流。字节流继承inputStream和OutputStream,字符流继承自InputSteamReader和OutputStreamWriter。
(2)字符流和字节流有什么区别?
字节流可用于任何类型的对象,包括二进制对象;
字符流只能处理字符或者字符串
如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点。
所有的文件在硬盘或在传输时都是以字节的方式进行的,包括图片等都是按字节的方式存储的,而字符是只有在内存中才会形成,所以在开发中,字节流使用较为广泛。
(3) 什么叫对象序列化,什么是反序列化,实现对象序列化需要做哪些工作?,有什么用途?
序列化:把Java对象转换为字节序列的过程。
反序列化:把字节序列恢复为Java对象的过程。
对象的序列化主要有两种用途:
1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
2) 在网络上传送对象的字节序列。
注解:当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。
将需要序化的类实现Serializable接口就可以了,该接口没有任何方法,可以理解为一个标记,即表明这个类可以序列化。注意的是被关键字static、transient修饰的变量不能被序列化。在被序列化后,transient修饰的变量会被设为初始值。如int型的是0、对象型的是null.
(4) BufferedReader属于哪种流,它主要是用来做什么的,它里面有那些经典的方法
BufferedReader是字符流,也是一种包装流,用来增强reader流.主要用来读取数据的,最经典的方法是readline,可以一次读一行,是reader不具备的.
(5) 如果我要对字节流进行大量的从硬盘读取,要用那个流,为什么?
用BufferedInputStream,原因:BufferedInputStream是InputStream的缓冲流,使用它可以防止每次读取数据时进行实际的写操作,代表着使用缓冲区。不带缓冲的操作,每读一个字节就要写入一个字节,由于涉及磁盘的IO操作相比内存的操作要慢很多,所以不带缓冲的流效率很低。带缓冲的流,可以一次读很多字节,但不向磁盘中写入,只是先放到内存里。等凑够了缓冲区大小的时候一次性写入磁盘,这种方式可以减少磁盘操作次数,速度就会提高很多!并且也可以减少对磁盘的损伤。
(6) 什么是节点流,什么是处理流,它们各有什么用处,处理流的创建有什么特征
节点流: 直接与数据源相连,用于输入或者输出
处理流:在节点流的基础上对之进行加工,进行一些功能的扩展
处理流的构造器必须要传入节点流的子类
(7) 如果我要打印出不同类型的数据到数据源,那么最适合的流是那个流,为什么?
用printstream,因为只有字节流才能读写各种类型的数据.
(8) 怎么样把输出字节流转换成输出字符流,说出它的步骤?
把字节流转成字符流,这里肯定就要用到适配器模式,很自然的要想到outputstreamwriter。它继承了Writer接口,但要创建它必须在构造函数中传入一个outputstream的实例,outputstreamwriter的作用也就是将outputstream适配到Writer。,它实现了Reader接口,并且持有了InputStream的引用。(关于适配器的作用,可以想一下电脑转接头的例子)
利用转换流outputstreamwriter.创建一个字节流对象,将其作为参数传入转换流outputstreamwriter中,得到字符流对象.