第七章-输入和输出流

一、单项选择题

1. File 对象不能用来                                                    【 】

A. 命名文件           B. 查询文件属性           C. 读写文件         D. 处理目录

2. 以下 Java 程序代码中, 能创建BufferedReader对象的是                             【 】

A. BufferedReader in = new BufferedReader( new FileReader("a. dat"));

B. BufferedReader in = new BufferedReader( new Reader("a. dat"));

C. BufferedReader in = new BufferedReader( new FileInputStream("a. dat"));

D. BufferedReader in = new BufferedReader( new InputStream ("a. dat"));

二、填空题

1. 某程序想要随机读写字符文件,能支持这个要求的类是RandomAccessFile

2. 用于读取字符流的抽象类是 java.io.Reader

3. Java中,在字节流和字符流之间起到中介作用,充当字节流和读者之间接口的类是InputSteamReader

三、简答题

1. 完成所有输入/输出操作所需的类都包含于哪个软件包中?

答:java.io:

这个包包含了大量用于文件和流的输入/输出操作的类,如 InputStream、OutputStream、Reader、Writer、FileInputStream、FileOutputStream 等。

常见的类还包括 BufferedReader、BufferedWriter、DataInputStream、DataOutputStream 等,用于处理文件或字节流的数据。

  1. 什么叫作流? 输入/输出流分别对应哪两个抽象类?

答:“流”(Stream)是一种抽象概念,用于表示数据的一系列有序集合,通常是从一个地方流向另一个地方的数据序列。

输入流(Input Stream):

输入流用于从源读取数据,如从文件、网络连接或其他数据源读取。

在Java中,输入流对应的抽象类是 java.io.InputStream。

输出流(Output Stream):

输出流用于向目的地写入数据,如写入文件、网络连接或其他数据目标。

在Java中,输出流对应的抽象类是 java.io.OutputStream。

  1. InputStream有哪些直接子类? 其功能是什么?

答:ByteArrayInputStream:

用于从字节数组中读取数据。

通常用于内存中的数据读取,而不是磁盘上的文件。

BufferedInputStream:

包装另一个输入流,为其提供缓冲功能,从而提高读取效率。

适用于需要频繁读取少量数据的情况,通过预先加载数据到缓冲区来减少磁盘I/O次数。

CheckedInputStream:

用于校验数据流的完整性,通过校验码(如CRC32)来验证数据是否未被篡改。

通常与其他输入流结合使用,提供数据校验功能。

DataInputStream:

提供了从输入流中读取基本数据类型(如int、float等)的方法。

通常用于读取二进制数据,提供了比 InputStream 更高级别的数据读取能力。

FileInputStream:

用于从文件系统中的文件读取数据。

是最常见的文件输入流之一,用于读取文件内容。

FilterInputStream:

是一个抽象类,用于包装其他输入流,并提供额外的功能或改变行为。

本身并不直接使用,而是作为其他过滤输入流(如 BufferedInputStream)的基础类。

ObjectInputStream:

用于反序列化对象。

从输入流中读取对象的状态,并恢复成对象的形式。

PipedInputStream:

与 PipedOutputStream 配合使用,用于线程间的数据通信。

数据可以从一个线程通过 PipedOutputStream 发送到另一个线程的 PipedInputStream。

SequenceInputStream:

用于合并多个输入流的数据。

当需要将多个输入流的数据顺序连接起来时使用。

  1. OutputStream有哪些直接子类? 其功能是什么?

答:ByteArrayOutputStream:

用于将数据写入到内存中的字节数组。

通常用于创建临时数据结构或在内存中处理数据,避免磁盘I/O。

BufferedOutputStream:

包装另一个输出流,为其提供缓冲功能,从而提高写入效率。

适用于需要频繁写入少量数据的情况,通过预先将数据缓存起来再一次性写入目标,减少磁盘I/O次数。

CheckedOutputStream:

用于校验数据流的完整性,通过校验码(如CRC32)来验证数据是否未被篡改。

通常与其他输出流结合使用,提供数据校验功能。

DataOutputStream:

提供了向输出流中写入基本数据类型(如int、float等)的方法。

通常用于写入二进制数据,提供了比 OutputStream 更高级别的数据写入能力。

FileOutputStream:

用于向文件系统中的文件写入数据。

是最常见的文件输出流之一,用于写入文件内容。

FilterOutputStream:

是一个抽象类,用于包装其他输出流,并提供额外的功能或改变行为。

本身并不直接使用,而是作为其他过滤输出流(如 BufferedOutputStream)的基础类。

ObjectOutputStream:

用于序列化对象。

将对象的状态写入输出流,以便以后可以恢复成对象的形式。

PipedOutputStream:

与 PipedInputStream 配合使用,用于线程间的数据通信。

数据可以从一个线程通过 PipedOutputStream 发送到另一个线程的 PipedInputStream。

PrintStream:

提供了类似于 System.out 的功能,用于格式化输出文本。

可以将输出定向到文件、控制台或其他输出流。

  1. 使用缓冲区输出流的好处是什么? 为什么关闭一个缓冲区输出流之前,应使用 flush()方法?

答:使用缓冲区输出流(如 BufferedOutputStream)的好处主要有以下几点:

提高性能:

缓冲区输出流内部维护了一个缓冲区,当写入数据时,数据首先写入缓冲区而不是立即写入目标(如磁盘)。当缓冲区满或者显式调用 flush() 方法时,才会将缓冲区中的数据写入目标。

这种机制减少了磁盘I/O操作的次数,因为磁盘I/O操作相对较为耗时,使用缓冲区可以显著提高写入速度。

减少系统资源消耗:

由于减少了磁盘I/O操作的频率,因此降低了系统的开销,节省了系统资源。

简化编程模型:

缓冲区输出流使得程序员可以专注于数据的逻辑写入,而不必关心底层的实际写入细节。

为什么关闭一个缓冲区输出流之前,应使用 flush() 方法?

当使用 BufferedOutputStream 或其他带有缓冲机制的输出流时,在关闭流之前调用 flush() 方法是非常重要的,原因如下:

保证数据完整写入:

如果在关闭流之前没有调用 flush() 方法,那么缓冲区中剩余的数据将不会被写入目标。这意味着部分数据可能会丢失。

避免数据不一致:

如果程序在没有调用 flush() 方法的情况下突然终止(例如,由于异常或系统崩溃),那么缓冲区中的数据就无法写入目标,导致数据不一致的问题。

  1. 读者和写者的作用是什么?

答:在Java中,Reader 和 Writer 是处理字符流(character streams)的抽象基类,它们主要用于处理文本数据。Reader 用于读取字符流,而 Writer 用于写入字符流。

  1. 什么叫作对象的序列化? 如何实现对象的序列化?

答:对象序列化(Serialization)是指将对象的状态(即其属性值)转换为一种可以持久保存或通过网络传输的形式的过程。序列化后的对象通常表现为字节流形式,可以保存到文件中、存储在数据库中或通过网络传输。

四、程序设计题

1. 实现一个输入程序,接收从键盘读入的字符串。当字符串中所含字符个数少于程序设定的上限时,输出这个字符串; 否则抛出 MyStringExceptionl 异常,在异常处理中要求重新输入新的字符串或中断程序运行。

2. 利用输入/输出流编写一个程序,实现文件复制的功能。程序的命令行参数的形式及操作功能均类似于 DOS中的 copy命令。

3. 利用输入/输出流及文件类编写一个程序,显示指定文本文件的内容。程序的命令行参数的形式及操作功能均类似于DOS中的 type命令,同时能够显示文件的有关属性,如文件名、路径,修改时间、文件大小等。

上一篇:C语言中的 printf( ) 与 scanf( )


下一篇:15:00面试,15:06就出来了,问的问题有点变态。。。