程序延迟写入.txt文件?

时间:2017-10-02 00:11:03

标签: java file-writing

所以,我已经搜索了一下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");
    }
}
}

1 个答案:

答案 0 :(得分:0)

文件可能没有物理写入磁盘,使用flush是不够的,来自java文档here

  

如果此流的预期目标是底层操作系统提供的抽象,例如文件,则刷新流只保证先前写入流的字节被传递给操作系统进行写入;它并不保证它们实际上是写入物理设备,如磁盘驱动器。

由于硬盘的读写速度,建议尽可能少地依赖硬盘访问。

在重新运行和使用时,可能会将随机数字符串存储到列表中,这将是一种解决方案。您甚至可以将列表写入磁盘,但这样实现并不依赖于文件写入的时间。

修改

在OP发布了更多代码后,很明显我的原始答案与问题无关。尽管如此,这仍然是合理的。

发布的代码OP不足以看到他在写完文件后何时阅读。看起来他在阅读后正在写文件,这当然是作为一个错误被认为是错误的。写作后阅读应该产生一个能够达到你想要的程序。 Id est,这个:

random.readDataFromFile(data); 
random.overwriteRandNums();

直到下次执行才会反映出来。这样:

random.overwriteRandNums();
random.readDataFromFile(data); 

将在当前执行中使用更新的文件。