一、单项选择题
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 等,用于处理文件或字节流的数据。
- 什么叫作流? 输入/输出流分别对应哪两个抽象类?
答:“流”(Stream)是一种抽象概念,用于表示数据的一系列有序集合,通常是从一个地方流向另一个地方的数据序列。
输入流(Input Stream):
输入流用于从源读取数据,如从文件、网络连接或其他数据源读取。
在Java中,输入流对应的抽象类是 java.io.InputStream。
输出流(Output Stream):
输出流用于向目的地写入数据,如写入文件、网络连接或其他数据目标。
在Java中,输出流对应的抽象类是 java.io.OutputStream。
- InputStream有哪些直接子类? 其功能是什么?
答:ByteArrayInputStream:
用于从字节数组中读取数据。
通常用于内存中的数据读取,而不是磁盘上的文件。
BufferedInputStream:
包装另一个输入流,为其提供缓冲功能,从而提高读取效率。
适用于需要频繁读取少量数据的情况,通过预先加载数据到缓冲区来减少磁盘I/O次数。
CheckedInputStream:
用于校验数据流的完整性,通过校验码(如CRC32)来验证数据是否未被篡改。
通常与其他输入流结合使用,提供数据校验功能。
DataInputStream:
提供了从输入流中读取基本数据类型(如int、float等)的方法。
通常用于读取二进制数据,提供了比 InputStream 更高级别的数据读取能力。
FileInputStream:
用于从文件系统中的文件读取数据。
是最常见的文件输入流之一,用于读取文件内容。
FilterInputStream:
是一个抽象类,用于包装其他输入流,并提供额外的功能或改变行为。
本身并不直接使用,而是作为其他过滤输入流(如 BufferedInputStream)的基础类。
ObjectInputStream:
用于反序列化对象。
从输入流中读取对象的状态,并恢复成对象的形式。
PipedInputStream:
与 PipedOutputStream 配合使用,用于线程间的数据通信。
数据可以从一个线程通过 PipedOutputStream 发送到另一个线程的 PipedInputStream。
SequenceInputStream:
用于合并多个输入流的数据。
当需要将多个输入流的数据顺序连接起来时使用。
- OutputStream有哪些直接子类? 其功能是什么?
答:ByteArrayOutputStream:
用于将数据写入到内存中的字节数组。
通常用于创建临时数据结构或在内存中处理数据,避免磁盘I/O。
BufferedOutputStream:
包装另一个输出流,为其提供缓冲功能,从而提高写入效率。
适用于需要频繁写入少量数据的情况,通过预先将数据缓存起来再一次性写入目标,减少磁盘I/O次数。
CheckedOutputStream:
用于校验数据流的完整性,通过校验码(如CRC32)来验证数据是否未被篡改。
通常与其他输出流结合使用,提供数据校验功能。
DataOutputStream:
提供了向输出流中写入基本数据类型(如int、float等)的方法。
通常用于写入二进制数据,提供了比 OutputStream 更高级别的数据写入能力。
FileOutputStream:
用于向文件系统中的文件写入数据。
是最常见的文件输出流之一,用于写入文件内容。
FilterOutputStream:
是一个抽象类,用于包装其他输出流,并提供额外的功能或改变行为。
本身并不直接使用,而是作为其他过滤输出流(如 BufferedOutputStream)的基础类。
ObjectOutputStream:
用于序列化对象。
将对象的状态写入输出流,以便以后可以恢复成对象的形式。
PipedOutputStream:
与 PipedInputStream 配合使用,用于线程间的数据通信。
数据可以从一个线程通过 PipedOutputStream 发送到另一个线程的 PipedInputStream。
PrintStream:
提供了类似于 System.out 的功能,用于格式化输出文本。
可以将输出定向到文件、控制台或其他输出流。
- 使用缓冲区输出流的好处是什么? 为什么关闭一个缓冲区输出流之前,应使用 flush()方法?
答:使用缓冲区输出流(如 BufferedOutputStream)的好处主要有以下几点:
提高性能:
缓冲区输出流内部维护了一个缓冲区,当写入数据时,数据首先写入缓冲区而不是立即写入目标(如磁盘)。当缓冲区满或者显式调用 flush() 方法时,才会将缓冲区中的数据写入目标。
这种机制减少了磁盘I/O操作的次数,因为磁盘I/O操作相对较为耗时,使用缓冲区可以显著提高写入速度。
减少系统资源消耗:
由于减少了磁盘I/O操作的频率,因此降低了系统的开销,节省了系统资源。
简化编程模型:
缓冲区输出流使得程序员可以专注于数据的逻辑写入,而不必关心底层的实际写入细节。
为什么关闭一个缓冲区输出流之前,应使用 flush() 方法?
当使用 BufferedOutputStream 或其他带有缓冲机制的输出流时,在关闭流之前调用 flush() 方法是非常重要的,原因如下:
保证数据完整写入:
如果在关闭流之前没有调用 flush() 方法,那么缓冲区中剩余的数据将不会被写入目标。这意味着部分数据可能会丢失。
避免数据不一致:
如果程序在没有调用 flush() 方法的情况下突然终止(例如,由于异常或系统崩溃),那么缓冲区中的数据就无法写入目标,导致数据不一致的问题。
- 读者和写者的作用是什么?
答:在Java中,Reader 和 Writer 是处理字符流(character streams)的抽象基类,它们主要用于处理文本数据。Reader 用于读取字符流,而 Writer 用于写入字符流。
- 什么叫作对象的序列化? 如何实现对象的序列化?
答:对象序列化(Serialization)是指将对象的状态(即其属性值)转换为一种可以持久保存或通过网络传输的形式的过程。序列化后的对象通常表现为字节流形式,可以保存到文件中、存储在数据库中或通过网络传输。
四、程序设计题
1. 实现一个输入程序,接收从键盘读入的字符串。当字符串中所含字符个数少于程序设定的上限时,输出这个字符串; 否则抛出 MyStringExceptionl 异常,在异常处理中要求重新输入新的字符串或中断程序运行。
2. 利用输入/输出流编写一个程序,实现文件复制的功能。程序的命令行参数的形式及操作功能均类似于 DOS中的 copy命令。
3. 利用输入/输出流及文件类编写一个程序,显示指定文本文件的内容。程序的命令行参数的形式及操作功能均类似于DOS中的 type命令,同时能够显示文件的有关属性,如文件名、路径,修改时间、文件大小等。