一、题目:
数字存取操作:让用户输入8个整数,将这些数写入文件num.txt中;然后从该文件读取这些数,在内存中对它们进行逆序排序,再打印输出结果。
要求:分别使用字节流和字符流操作方式完成。
提示:保存时把数字转为字符串,再写入文件;读取时,以字符串读出来,再解析为数字。
二、实验设计
a、设计思路:
这个程序的主要目标是实现一个数字存取和排序的操作,它可以分为五个主要步骤:
- 数据输入:首先,程序需要从用户那里获取一组数字。这里,我们选择了8个整数作为输入。
- 数据存储:接着,程序需要将这些数字存储起来。在这个程序中,我们选择将这些数字存储在一个文本文件中。
- 数据读取:然后,程序需要从存储设备中读取这些数字。在这个程序中,我们从之前存储数字的文本文件中读取数据。
- 数据处理:读取数据后,程序需要对这些数字进行处理。在这个程序中,我们选择对这些数字进行逆序排序。
- 数据输出:最后,程序需要将处理后的结果输出给用户。
b、主要代码结构:
- 输入阶段:使用Scanner类从用户那里获取8个整数。
- 写入阶段:使用FileOutputStream或FileWriter将这些整数写入到文件num.txt中。
- 读取阶段:使用FileInputStream或FileReader和BufferedReader从文件num.txt中读取这些整数。
- 排序阶段:使用Arrays.sort方法对这些整数进行排序。
- 输出阶段:打印输出排序后的结果。
c、主要代码段的文字分析:
- 字节流操作:在这部分中,我们使用FileOutputStream和FileInputStream来进行文件的写入和读取操作。在写入文件时,我们将每个整数转换为字节,并写入到文件中。在读取文件时,我们读取文件中的所有字节,并将其转换为字符串。然后,我们将这些字符串解析为整数,并进行逆序排序。
- 字符流操作:在这部分中,我们使用FileWriter和FileReader来进行文件的写入和读取操作。在写入文件时,我们将每个整数转换为字符串,并写入到文件中。在读取文件时,我们使用BufferedReader来一行一行地读取文件。然后,我们将这些字符串解析为整数,并进行逆序排序。这部分的操作与字节流操作类似,只是在处理字符数据时,字符流操作更为方便。
d、输出结果截图:
图2-1
三、总结
在字节流操作的代码中,我们使用了FileOutputStream
和FileInputStream
来进行文件的写入和读取。这两个类都是字节流类,它们以字节为单位进行操作,因此在处理非文本文件(如图片、音频等)时,效果更好。
在字符流操作的代码中,我们使用了FileWriter
和FileReader
来进行文件的写入和读取。这两个类都是字符流类,它们以字符为单位进行操作,因此在处理文本文件时,效果更好。
这两段代码都很好地完成了题目的要求,展示了字节流和字符流在文件操作中的应用。在实际编程中,我们可以根据需要选择使用字节流还是字符流。如果处理的是文本文件,那么字符流可能是更好的选择;如果处理的是非文本文件,那么字节流可能是更好的选择。这两种流操作方式各有优势,需要根据实际情况灵活选择。这也是我们在学习和使用Java I/O流时需要掌握的重要知识点。
四、附录代码
//字节流操作:
import java.io.*;
import java.util.*;
public class ByteStreamExample {
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
int[] numbers = new int[8];
System.out.println("请输入8个整数:");
for (int i = 0; i < 8; i++) {
numbers[i] = scanner.nextInt();
}
// 写入文件
FileOutputStream fos = new FileOutputStream("num.txt");
for (int i = 0; i < 8; i++) {
fos.write((numbers[i] + "\n").getBytes());
}
fos.close();
// 读取文件
FileInputStream fis = new FileInputStream("num.txt");
byte[] bytes = new byte[fis.available()];
fis.read(bytes);
fis.close();
String[] strNumbers = new String(bytes).split("\n");
// 解析为数字并逆序排序
for (int i = 0; i < 8; i++) {
numbers[i] = Integer.parseInt(strNumbers[i]);
}
Arrays.sort(numbers);
System.out.println("逆序排序后的结果:");
for (int i = 7; i >= 0; i--) {
System.out.println(numbers[i]);
}
}
}
//字符流操作:
import java.io.*;
import java.util.*;
public class CharStreamExample {
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
int[] numbers = new int[8];
System.out.println("请输入8个整数:");
for (int i = 0; i < 8; i++) {
numbers[i] = scanner.nextInt();
}
// 写入文件
FileWriter fw = new FileWriter("num.txt");
for (int i = 0; i < 8; i++) {
fw.write(numbers[i] + "\n");
}
fw.close();
// 读取文件
FileReader fr = new FileReader("num.txt");
BufferedReader br = new BufferedReader(fr);
String line;
int i = 0;
while ((line = br.readLine()) != null) {
numbers[i++] = Integer.parseInt(line);
}
br.close();
// 逆序排序
Arrays.sort(numbers);
System.out.println("逆序排序后的结果:");
for (i = 7; i >= 0; i--) {
System.out.println(numbers[i]);
}
}
}