在Java开发中,处理包含大量重复整数的文本文件,并提取唯一值填充到数组中,需要兼顾IO效率和去重逻辑的正确性,避免不必要的性能损耗。

核心实现思路
整个流程可以分为三个核心步骤:首先是高效读取文件内容,其次是完成整数去重,最后是将去重后的结果填充到数组中。IO层面推荐使用BufferedReader减少磁盘读写次数,去重层面使用HashSet的特性自动过滤重复值,最终将集合转为数组即可。
步骤拆解
- 使用
BufferedReader按行读取整数文件,避免一次性加载大文件到内存 - 将读取到的字符串转为整数,遇到非法格式跳过并记录日志
- 将合法整数存入
HashSet,利用集合特性自动去重 - 将
HashSet转为数组,完成填充操作
完整代码实现
以下是完整的实现代码,包含异常处理和边界情况判断:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
public class UniqueIntFileReader {
/**
* 读取整数文件并去重填充数组
* @param filePath 整数文件路径
* @return 去重后的整数数组
* @throws IOException 文件读取异常
*/
public static int[] readUniqueIntsFromFile(String filePath) throws IOException {
// 使用HashSet存储去重后的整数
Set<Integer> uniqueIntSet = new HashSet<>();
// 创建BufferedReader提升IO效率
try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
String line;
while ((line = br.readLine()) != null) {
// 跳过空行
if (line.trim().isEmpty()) {
continue;
}
try {
// 将行内容转为整数
int num = Integer.parseInt(line.trim());
// 加入Set自动去重
uniqueIntSet.add(num);
} catch (NumberFormatException e) {
// 非法格式的行跳过,可在此处添加日志记录
System.err.println("跳过非法行内容:" + line);
}
}
}
// 将Set转为数组
int[] result = new int[uniqueIntSet.size()];
int index = 0;
for (int num : uniqueIntSet) {
result[index++] = num;
}
return result;
}
// 测试方法
public static void main(String[] args) {
String testFilePath = "test_ints.txt";
try {
int[] uniqueInts = readUniqueIntsFromFile(testFilePath);
System.out.println("去重后整数数量:" + uniqueInts.length);
for (int num : uniqueInts) {
System.out.print(num + " ");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
代码说明
上述代码中,BufferedReader配合try-with-resources语法可以自动关闭资源,避免资源泄露。HashSet的add方法会自动判断元素是否存在,重复元素不会被加入,天然实现去重逻辑。最后通过遍历HashSet将元素填充到数组中,完成整个流程。
性能优化建议
如果处理的文件非常大,还可以做进一步优化:
- 提前指定
HashSet的初始容量,减少扩容带来的性能损耗 - 如果文件中的整数范围固定,可以使用
BitSet替代HashSet,进一步降低内存占用 - 对于超大文件,可以结合多线程分块读取,最后合并去重结果
常见异常处理
实际使用中需要注意几种异常情况:文件路径不存在会抛出IOException,文件内容包含非整数格式的行会触发NumberFormatException,代码中已经对这两种情况做了基础处理,开发者可以根据实际需求扩展异常处理逻辑,比如添加更详细的日志记录或者自定义异常抛出。