如何生成唯一的数字ID并在java中保持计数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何生成唯一的数字ID并在java中保持计数?相关的知识,希望对你有一定的参考价值。

我正在研究一个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支持大量的InputStreamsOutputStreams,它们为整个世界提供了可能性,包括文件读取和写入。

编写文件的基本方法是使用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();
}

以上是关于如何生成唯一的数字ID并在java中保持计数?的主要内容,如果未能解决你的问题,请参考以下文章

java使用poi解析或处理excel的时候,如何防止数字变成科学计数法的

按照 C# 中的“digitStringDigit”等特定模式生成唯一 ID

java生成唯一ID

雪花算法的原理和 Java 实现

Firebase:如何为键生成唯一的数字 ID?

java生成18位的唯一id