所以,我已经搜索了一下stackoverflow,但我似乎找不到这个问题的答案。
我目前为CS课程做的功课包括从一个包含5000个随机数的文件中读取数据并对数据进行各种操作,比如将数据放入数组中,查看数字出现的次数,以及找出增长最快的序列是什么。我已经完成了所有这些。
除此之外,我(我自己)添加了一个方法,允许我覆盖文件并创建5000个新的随机数,以确保我的代码适用于多个不同的测试用例。
该方法大部分都有效,但是在我调用之后,它似乎在程序的其余部分完成之后才“激活”。如果我运行它并告诉它更改数字,我必须再次运行它才能真正看到程序中更改的值。有办法解决这个问题吗?
当前输出显示更改数据之间的延迟:
此处不尝试更改数据 - 控制案例。
elkshadow5$ ./CompileAndRun.sh
Create a new set of numbers? Y for yes. n
What number are you looking for? 66
66 was found 1 times.
The longest sequence is [606, 3170, 4469, 4801, 5400, 8014]
It is 6 numbers long.
这里的数字应该改变,但他们没有。
elkshadow5$ ./CompileAndRun.sh
Create a new set of numbers? Y for yes. y
What number are you looking for? 66
66 was found 1 times.
The longest sequence is [606, 3170, 4469, 4801, 5400, 8014]
It is 6 numbers long.
现在数据显示它已更改,数据应该在更改后运行。
elkshadow5$ ./CompileAndRun.sh
Create a new set of numbers? Y for yes. n
What number are you looking for? 1
1 was found 3 times.
The longest sequence is [1155, 1501, 4121, 5383, 6000]
It is 5 numbers long.
我的代码:
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;
public class jeftsdHW2 {
static Scanner input = new Scanner(System.in);
public static void main(String args[]) throws Exception {
jeftsdHW2 random = new jeftsdHW2();
int[] data;
data = new int[5000];
random.readDataFromFile(data);
random.overwriteRandNums();
}
public int countingOccurrences(int find, int[] array) {
int count = 0;
for (int i : array) {
if (i == find) {
count++;
}
}
return count;
}
public int[] longestSequence(int[] array) {
int[] sequence;
return sequence;
}
public void overwriteRandNums() throws Exception {
System.out.print("Create a new set of numbers? Y for yes.\t");
String answer = input.next();
char yesOrNo = answer.charAt(0);
if (yesOrNo == 'Y' || yesOrNo == 'y') {
writeDataToFile();
}
}
public void readDataFromFile(int[] data) throws Exception {
try {
java.io.File infile = new java.io.File("5000RandomNumbers.txt");
Scanner readFile = new Scanner(infile);
for (int i = 0; i < data.length; i++) {
data[i] = readFile.nextInt();
}
readFile.close();
} catch (FileNotFoundException e) {
System.out.println("Please make sure the file \"5000RandomNumbers.txt\" is in the correct directory before trying to run this.");
System.out.println("Thank you.");
System.exit(1);
}
}
public void writeDataToFile() throws Exception {
int j;
StringBuilder theNumbers = new StringBuilder();
try {
PrintWriter writer = new PrintWriter("5000RandomNumbers.txt", "UTF-8");
for (int i = 0; i < 5000; i++) {
if (i > 1 && i % 10 == 0) {
theNumbers.append("\n");
}
j = (int) (9999 * Math.random());
if (j < 1000) {
theNumbers.append(j + "\t\t");
} else {
theNumbers.append(j + "\t");
}
}
writer.print(theNumbers);
writer.flush();
writer.close();
} catch (IOException e) {
System.out.println("error");
}
}
}
答案 0 :(得分:0)
文件可能没有物理写入磁盘,使用flush是不够的,来自java文档here:
如果此流的预期目标是底层操作系统提供的抽象,例如文件,则刷新流只保证先前写入流的字节被传递给操作系统进行写入;它并不保证它们实际上是写入物理设备,如磁盘驱动器。
由于硬盘的读写速度,建议尽可能少地依赖硬盘访问。
在重新运行和使用时,可能会将随机数字符串存储到列表中,这将是一种解决方案。您甚至可以将列表写入磁盘,但这样实现并不依赖于文件写入的时间。
修改强>
在OP发布了更多代码后,很明显我的原始答案与问题无关。尽管如此,这仍然是合理的。
发布的代码OP不足以看到他在写完文件后何时阅读。看起来他在阅读后正在写文件,这当然是作为一个错误被认为是错误的。写作后阅读应该产生一个能够达到你想要的程序。 Id est,这个:
random.readDataFromFile(data);
random.overwriteRandNums();
直到下次执行才会反映出来。这样:
random.overwriteRandNums();
random.readDataFromFile(data);
将在当前执行中使用更新的文件。