输入输出流的面试题

来源:互联网 发布:管锥编 知乎 编辑:程序博客网 时间:2024/06/05 00:52
1.
*输入与输出(I/O)是计算机与外部世界沟通的桥梁。为进行文件

和数据的输入/输出操作,Java中把不同的输入/输出源抽象表述

为“流”(stream).Java中提供了许多功能强大的类来实现多种类

型数据的输入输出。前面,我们使用System.out对象的方法.在控

制台上显示输出结果,这是标准的输入输出。Java中所有的输入/

输出都是以流的形式进行处理的。Java的输入输出数据流包括字

节流、字符流、对象流等

2.

*按数据流的方向不同可以分为:输入流和输出流

*输入流:只能从中读取字节数据,而不能向其写出数据

*输出流:只能向其写入字节数据,而不能从中读取数据

当程序需要读取数据的时候,就会生成一个通向数据源的流,这


个数据源可以是文件、内存,或是网络连接,这时称该流为输入

流(InputStream),如图所示。当程序需要写入数据的时候,

就会生成一个通向目的地的流,此时流被称为输出流

(OutputStream)
3.
*按处理数据单位不同可以分为字节流和字符流

*字节流:用于处理字节数据。

*字符流:用于处理Unicode字符数据。

*J2SDK所提供的所有流类型位于包java.io内都分别继承自以下四种抽

象流类型


4.*普通的字节、字符流都是一个字节一个字符这样

读取的,而缓冲流则是将数据先缓冲起来,然后一

起写入或者读取出来
*缓冲流为I/O流增加了内存缓冲区,使用缓冲流

的好处是,能够更高效的读写信息。缓冲流

要“套接”在相应的节点流(低级流)之上,对读

写的数据提供了缓冲的功能。

*缓冲输入流支持其父类的mark()reset()

法:mark()用于“标记”当前位置,就像加入了

一个书签,可以使用reset()方法返回这个标记

重新读取数据

5.缓冲流字节流
*java.io.BufferedInputStream类可以对任何

InputStream流进行带缓冲的封装以达到性

能的改善。该类在已定义输入流上再定义一个

具有缓冲的输入流,可以从此流中成批地读取

字符而不会每次都引起直接对数据源的读操

作。数据输入时,首先被放入缓冲区,随后的

读操作就是对缓冲区中的内容进行访问


*java.io.BufferedOutputStream不直接写入

输出流,先写入缓冲区,当缓冲区满时,字节

数据才会写到BufferedOutputStream所连接的

流,调用该类的flush()将缓冲区全部写入输

出流


6.缓冲流字符流
*java.io.BufferedReader从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。可以指定缓冲区的大小,或者可使用默认的大小。
*java.io.BufferedWriter提供了newLine()用于写入一个行分隔符。
*对于输出的缓冲流,写出的数据会先在内存中缓存,使用flush()方法将会使内存中的数据立刻写出

7.对象序列化的概念
*一般地,对象不能脱离应用程序。但有时候,需要将对象的状态保存下来,在需要时再将对象恢复,即对象持久化(Persistence)。对象序列化(ObjectSerialization)可以将对象存储到外存中或以二进制形式通过网络传输。对象反串行化可以从这些数据中重构一个与原始对象状态相同的对象
*为了实现对象系列化,对应的类必须实现下面的两种接口之一:
*Serializable
*Externalizable





================================================

1.Java IO流的实现机制是什么?

流的本质是数据传输,根据处理数据类型的不同,流可以分为两大类:字节流和字符流。 
字节流以字节(8 bit)为单位,包括两个抽象类:InputStream 和 OutputStream 
字符流以字符(16 bit)为单位,根据码表映射字符,一次可以读多个字节,它包含两个抽象类:Reader和Writer。 
其主要区别是:字节流在处理输入输出时不会用到缓存,而字符流用到了缓存。 
流的主要作用是为了改善程序性能并且使用方便。

2.管理文件和目录的类是什么

     1.File(String pathname) 根据指定的路径创建一个File对象 
2.createNewFile() 若目录或文件存在,则返回false;否则创建文件或文件夹 
3.delete() 删除文件或文件夹 
4.isFile() 判断这个对象是不是文件 
5.isDirectory() 判断这个对象是否表示文件夹 
6.listFiles() 若对象代表目录,则返回所有文件的File对象 
7.mkdir() 根据当前指定的路径创建目录 
8.exists() 判断对象对应的文件是否存在

3.反序列化

它将流转换为对象。在序列化和反序列化过程中,serialVersionUID起着非常重要的作用,每个类都有一个特定的serialVersionUID来判定类的兼容性。如果待序列化的对象与目标对象的serialVersionUID不同,那么反序列化就会抛出InvalidClassException异常。一个好的编程习惯,最好在被序列化的类中显式地声明serialVersionUID(该字段定义为static final)。自定义有以下优点: 
1.提高程序运行效率 
2.提高程序不同平台的兼容性 
3.增强各个版本兼容性

4.序列化(Serialization) 
在分布式环境下,当进行远程通信时,无论是何种类型的数据,都会以二进制序列的形式在网络上传送。序列化是一种将对象以一连串的字节描述的过程,用于解决在对对象流进行读写操作是所引发的问题。序列化可以将对象的状态写在流里进行网络传输,或者保存到文件、数据库等系统里,并在需要时把流读取出来重新构造一个相同的类。 
所有要实现序列化的类都必须实现呢Serializable接口,Serializable接口位于java.lang包中,它里面没有包含任何方法。使用一个输出流(例如FileOutputStream)来构造一个ObjectOutputStream(对象流)对象。紧接着,使用该对象write() Object(Object obj)就可以将obj对象写出(保存其状态),要恢复时可以使用其对应的输入流。 
序列化的特点: 
1.如果一个类能被序列化,那么它的子类也能够被序列化。 
2.由于static和transient 代表对象的临时数据,因此被声明为这两种类型的数据成员是不能够被序列化的。

序列化的使用会影响系统的性能,如果不是必须要使用序列化,应尽量不使用序列化。以下情况时需要使用序列化: 
1.通过网络来发送对象,或对象的状态需要被持久化到数据库或文件中。 
2.序列化能实现深层复制,即可以复制引用的对象。

6.I/O是用来做什么的?

是用来永久保存数据的,是数据持久化的一中机制;

     7.

InputStream(字节输入流)和Reader(字符输入流)

OutputStream(字节输出流)和writer(字符输出流)


8.序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方

法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出

流(如:FileOutputStream)来构造一个 ObjectOutputStream(对象流)对象,接着,使

用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对

象写出(即保存其状态),要恢复的话则用输入流。


9.

请选择正确的答案

A .system.out是一个printStream

B .system.out是一个outputstream

C.system.out是一个FilterOutputStream

D.system.out不是一个printStream

E.system.out在异常时,会抛出IOException

结果是:ABCE

http://blog.csdn.net/shikanong/article/details/50994429

system.out 是一个printStream,printStream是FileterOutStream的一个子类,FileOutStream是OutputStream的一个子类,Printsream对象并没有抛出ioexception


10.*什么被序列化
*属性(包括基本数据类型、数组、对其它对象的引用)
*类名
*什么不被序列化
*static的属性
*方法
*加了transient修饰符的属性

要想序列化对象,必须先创建一个outputstream,然后把它嵌进

objectoutputstream。这时就能用writeobject()方法把对象写

outputstream,。读的时候需要把inputstream嵌到objectinputstream

中,然后在调用readobject()方法。

Serializable接口是一个里面什么都没有的接口?
它的源代码是public interface Serializable{},即什么都没有。
如果一个接口里面什么内容都没有,那么这个接口是一个标识接口,比如,一个学生遇到一个问题,排错排了几天也没解决,此时,她举手了(示意我去帮他解决),然后我过去,帮他解决了,那么这个举手其实就是一个标识,自己不能解决的问题标示我去帮他解决,在Java中的这个Serializable接口是给JVM看的,告诉JVM,我不做这个类的序列化了,你(JVM)给我序列化,
     序列化就是变成二进制流,比如云计算、Hadoop,特别是Hadoop完全就是分布式环境,那么就要涉及到对象要在网络中传输,里面的全是二进制流,当然你来做这个序列化操作也可以,但是这个类里面可能还有一个类,如果你把外面的类对象Person变成二进制,那么里面也要序列化(这要用到深度遍历,很麻烦),干脆告诉JVM,让他来帮你做。








































原创粉丝点击