感觉最后这个实验还是有点难度的,前前后后花了整整一个下午的时间,只给出实验思路和关键代码,仅供学习参考,千万不要直接抄袭啊。。。
实验题目
- 本实验要求学生通过SequenceFile实现对多个小文件的封装。
要求如下:- 使用随机数生成以(整数,字符串)为(key,Value)的文本文件,文件的大小内容任意,文件数量不少于100个;
- 如果需要,可以选择以下代码生成随机文件。
- 使用SequenceFile对以上文件进行封装,生成一个独立文件,压缩格式任意;
- 实现以下的三种方式的查询:
- 给出文件名,可以从序列文件整体读取文件并存储到指定的位置;
- 给出某个整数的key,可以读取所有该key的数据,并给出所在文件的名称(可以输出到控制台)
- 给出文件名和整数的key,可以读取该文件中的对应key的数据(可以输出到控制台)。
具体思路
- 我们将这次的实验任务进行拆解,大概分为三个小模块。
- (1)生成待处理的文件
- 设计一段代码,要求可以生成至少100个小文件,同时,每个小文件里面需要有一点点内容。
- 这个直接利用Java的相关文件IO函数即可。
package org.example;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* 生成100个文件,每个文件里面生成随机的数字
*/
public class RandomTxtFileCreator {
public static void main(String[] args) {
long start=System.currentTimeMillis();
// 生成文件的个数
int numFiles = 3;
// 文件里面的数据的条数
int numRecorders = 10;
// 指定文件的生成路径
String uri = "/home/lyp/backend-projects/demo/src/main/java/static";
Random random = new Random();
try {
// 循环生成numFiles个文件
for (int i = 1; i <= numFiles; i++) {
System.out.println("writing file#"+i);
// 指定当前生成的文件的路径
FileOutputStream fileOutputStream = new FileOutputStream(uri + "/file" + i);
// 将每个文件的生成的内容暂时存储到一个列表里面
List<String> list = new ArrayList<>();
for (int j = 0; j < numRecorders; j++){
list.add(random.nextInt(numRecorders) + 1 + "\t" + "the recorder #" + j+ " in file#" + i);
}
PrintStream pStream = new PrintStream(new BufferedOutputStream(fileOutputStream));
// 将这个list里面的所有的内容写到当前的这个文件里面
for (String str : list) {
pStream.println(str);
}
pStream.close();
fileOutputStream.close();
}
} catch (Exception e) {
e.printStackTrace(