Каков наилучший способ создания уникального и короткого имени файла в Java - PullRequest
68 голосов
/ 05 мая 2009

Я не хочу использовать UUID, так как они довольно длинные.

Файл должен быть уникальным в своем каталоге.

Одна мысль, которая приходит в голову, - это использовать File.createTempFile(String prefix, String suffix), но это кажется неправильным, поскольку файл не является временным.

Необходимо обработать регистр двух файлов, созданных за одну и ту же миллисекунду.

Ответы [ 15 ]

0 голосов
/ 12 июля 2017

Почему бы не использовать синхронизированный для обработки многопоточности. вот мое решение, оно может генерировать короткое имя файла, и оно уникально.

private static synchronized String generateFileName(){
    String name = make(index);
    index ++;
    return name;
}
private static String make(int index) {
    if(index == 0) return "";
    return String.valueOf(chars[index % chars.length]) + make(index / chars.length);
}
private static int index = 1;
private static char[] chars = {'a','b','c','d','e','f','g',
        'h','i','j','k','l','m','n',
        'o','p','q','r','s','t',
        'u','v','w','x','y','z'};

взорвалась главная функция для теста, это работа.

public static void main(String[] args) {
    List<String> names = new ArrayList<>();
    List<Thread> threads = new ArrayList<>();
    for (int i = 0; i < 100; i++) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 1000; i++) {
                    String name = generateFileName();
                    names.add(name);
                }
            }
        });
        thread.run();
        threads.add(thread);
    }

    for (int i = 0; i < 10; i++) {
        try {
            threads.get(i).join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    System.out.println(names);
    System.out.println(names.size());

}
0 голосов
/ 10 июня 2017

Я понимаю, что опоздал ответить на этот вопрос. Но я думаю, что я должен поставить это, поскольку это кажется чем-то отличным от другого решения.

Мы можем объединить имя потока и текущую метку времени в качестве имени файла. Но с этим есть одна проблема, например, когда имя какого-либо потока содержит специальный символ, такой как «\», который может создать проблему при создании имени файла. Таким образом, мы можем удалить специальный символ из имени потока, а затем объединить имя потока и отметку времени

fileName = threadName(after removing special charater) + currentTimeStamp
0 голосов
/ 05 июня 2017

Это также работает

String logFileName = new SimpleDateFormat("yyyyMMddHHmm'.txt'").format(new Date());

logFileName = "loggerFile_" + logFileName;
0 голосов
/ 05 мая 2009

Похоже, у вас есть несколько решений для создания уникального имени файла, поэтому я оставлю это в покое. Я бы проверил имя файла так:

    String filePath;
    boolean fileNotFound = true;
    while (fileNotFound) {
        String testPath = generateFilename();

        try {
            RandomAccessFile f = new RandomAccessFile(
                new File(testPath), "r");
        } catch (Exception e) {
            // exception thrown by RandomAccessFile if 
            // testPath doesn't exist (ie: it can't be read)

            filePath = testPath;
            fileNotFound = false;
        }
    }
    //now create your file with filePath
0 голосов
/ 05 мая 2009

Как насчет генерации на основе метки времени, округленной до ближайшей миллисекунды, или любой необходимой вам точности ... затем используйте блокировку для синхронизации доступа к функции.

Если вы сохраняете последнее сгенерированное имя файла, вы можете добавлять к нему последовательные буквы или дополнительные цифры по мере необходимости, чтобы сделать его уникальным.

Или, если вы предпочитаете делать это без блокировок, используйте шаг по времени плюс идентификатор потока и убедитесь, что функция длится дольше миллисекунды или ждет, пока она сделает это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...