Lab 10: 高级 I/O

本次 Lab 时长为 2 周,DDL 为 11 月 27 日 23:59

附件下载(包括问答题和实验报告模板):https://bhpan.buaa.edu.cn/link/AA96D0CA694BB74ABFA070F38B6C527AC6

实验目的

  • 理解并掌握控制台读入数据、标准输入输出、Scanner 类(基础的输入输出)

  • 理解并掌握 Java 文件管理(File 类)、输入/输出流类及其派生类的使用(字节流的顺序读写)

  • 理解并掌握读写器及其派生类的使用(字符流的顺序读写)

  • 理解并掌握对象序列化(对象流的读写)

实验题目

Question 1: 简答

如果准备按字节读取一个文件的内容,应当使用 FileInputStream 流还是 FileReader 流,为什么?

Question 2: 简答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileInputStreamTest {
public static void main(String[] args) {
File f = new File("hello.txt");
byte[] a = "abcd".getBytes();
try {
FileOutputStream out = new FileOutputStream(f);
out.write(a);
out.close();
FileInputStream in = new FileInputStream(f);
byte[] tom = new byte[3];
// Part Ⅰ
int m = in.read(tom, 0, 3);
System.out.println(m); // 3
String s = new String(tom, 0, 3);
System.out.println(s); // abc
// Part Ⅱ
m = in.read(tom, 0, 3);
System.out.println(m);// 1
s = new String(tom, 0, 3);
System.out.println(s);// dbc
} catch (IOException e) {
}
}
}
  1. 写出程序的输出;
  2. 解释 Part ⅠPart Ⅱ 的输出为什么不同。

Question 3: 编程

设计一个方法,用于移除文件中的注释。

1
public static void removeComments(String inputPath, String outPath) throws IOException;

input.txt

1
2
3
4
5
6
7
8
9
File f = new File("./java.oop");
System.out.println("当前文件是:" + f); // 这是一条注释
// 这是另一条注释
System.out.println("判断是否存在:" + f.exists());
/*
这些还是注释
*/
// 这是个位置有点奇怪的注释
System.out.println("判断是否是文件夹:" +/* 这是位置更奇怪的注释 */ f.isDirectory());

out.txt

在删除注释后, 你可以自由选择是否删除空行

一种可能的输出如下。

1
2
3
4
5
6
7
8
9
File f = new File("./java.oop");
System.out.println("当前文件是:" + f);

System.out.println("判断是否存在:" + f.exists());




System.out.println("判断是否是文件夹:" + f.isDirectory());

Question 4: 编程

设计一个方法,使用 Java 的输入、输出流将一个文本文件的内容按行读出,每读出一行就顺序添加行号,并写入到另一个文件中。

1
public static void addLineNo(String inputPath,String outPath) throws IOException;

Question 5: 编程

复制文件是常见的 IO 操作,设计如下方法,实现复制源文件 sourceFile 到目标文件 targetFile 的功能。

1
public static void copyFile (String sourceFile, String targetFile) throws IOException;

Question 6: 编程

设计一个方法,复制一个文件夹下面所有文件和后代文件夹内容到另一文件夹,即递归复制。

1
public static void copyDirectory(String sourceDir, String targetDir) throws IOException;

Hint:可以尝试复用 Q5 的代码。