我正在研究一个Java机器人,它从excel文件中复制信息并将其粘贴到程序上以创建用户名。除了ID号之外,我从excel文件中获取了所需的一切。
我正在尝试生成一个唯一的仅限数字的ID(因此UUID不起作用)。它必须是6位数字,因此,它的范围在100,000到999,999之间。这是我到目前为止所得到的:
public void genID() {
ArrayList<Integer> casillero = new ArrayList<Integer>();
for (int i = 100000; i < 1000000; i++) {
casillero.add(new Integer(i));
} Collections.shuffle(casillero);
for (int i = 0; i < 1; i++) {
System.out.println("El nuevo ID de casillero es: I" + casillero.get(i));
}
}
这会生成一个6位数字,这很好。但是,如何确保下次运行java程序时没有生成这个数字?谢谢!
JVM不可能记住其先前运行时的任何值(不包括代码本身中编译的静态值)。因为如果这样,你必须编写程序以在运行时保存重要数据,否则它将在最后一个线程终止时丢失。 Java支持大量的InputStreams
和OutputStreams
,它们为整个世界提供了可能性,包括文件读取和写入。
编写文件的基本方法是使用FileOutputStream
,它将原始字节写入给定文件。有一些像PrintStream
这样的对象会自动获取给定字符串的字节(如果传递了对象,则会解析字符串)并将它们写入输出流。
您需要在程序终止之前将ID保存到文件中,并在每次调用genID()
方法时读取文件。读取文件后,可以使用简单的循环检查生成的ID列表中的任何现有值。考虑这个例子:
public void genID() {
ArrayList<Integer> casillero = new ArrayList<Integer>();
for (int i = 100000; i < 1000000; i++) {
casillero.add(new Integer(i));
} Collections.shuffle(casillero);
for (int i = 0; i < 1; i++) {
System.out.println("El nuevo ID de casillero es: I" + casillero.get(i));
}
try {
getUsedIDS().forEach(i -> {
/*
* Iterate through the existing IDs
* and make sure that casillero does
* not contain any of them.
*/
if(casillero.contains(i)) casillero.remove(i);
});
} catch (IOException e) {
e.printStackTrace();
}
}
public List<Integer> getUsedIDS() throws IOException {
//The file which you saved the IDs to.
File file = new File("IDs.txt");
//Return all the values in the file.
return Files.readAllLines(file.toPath()).stream().mapToInt(s -> Integer.parseInt(s)).boxed().collect(Collectors.toList());
}
public void saveIDs(List<Integer> IDs) throws FileNotFoundException {
/*
* Create a PrintStream that writes into a
* FileOutputStream which in turn writes to your file.
* Because 'true' was passed to the constructor, this
* stream will append to the file.
*/
PrintStream s = new PrintStream(new FileOutputStream(new File("IDs.txt"), true));
//Print every element in the IDs list.
IDs.forEach(s::println);
/*
* Read more about flush here:
* https://stackoverflow.com/a/2340125/5645656
*/
s.flush();
/*
* Close the stream to prevent a resource leak.
*/
s.close();
}