我理解这个问题,但不确定如何解决。
public static List<String> getNumbersInRange(long start, long end) {
for (long i = start; i < end; i++) {
String padded = String.format("%012d", i);
result.add(padded);
}
return result;
}
上面是数字生成器,下面是文件生成器。我怎样才能做到这一点,这样我就不会出现内存泄漏?
long value = 1L;
long value1 = 100000000001L;
getNumbersInRange(value,value1);
BufferedWriter writer = new BufferedWriter(new FileWriter("UPC.txt"));
for(String str: result) {
writer.write(str + System.lineSeparator());
}
writer.close();
请原谅我,如果这没有经过深思熟虑,我已经有一段时间没有做任何编程了。
-
您将无法在列表中保留100_000_0000_000个长数字,因为Java中任何集合/数组的大小都是整数,因此它不能包含超过
Integer.MAX_VALUE
的项。 -
为了将上述范围打印到文件中,它将使用普通数字格式的
1,088,888,888,890
数字加上100,000,000,000
分隔符来分隔数字,因此它将占用1,107
GB的磁盘空间。假设你的硬盘能够以100MB/s的速度写入,那么写这个文件需要3个多小时。
不应该有一个返回要打印的字符串列表的函数,而应该编写一个在生成字符串时将字符串打印到文件中的函数。这样你就不必在内存中存储一个巨大的列表。
你可以试试这样的东西:
long value = 1L;
long value1 = 100000000001L;
LongStream.rangeClosed(value, value1)
.forEach(val -> {
try (BufferedWriter writer = new BufferedWriter(new FileWriter("UPC.txt", true));){
writer.write(String.format("%012d", val) + System.lineSeparator());
} catch (IOException e) {
e.printStackTrace();
}
});
这样,
- 您不在内存中保存数据
- 数据是为您自动生成的
- FileWriter构造函数应将第二个参数设置为true,以指示要附加到文件