Ich möchte nicht unbedingt UUIDs verwenden, da diese ziemlich lang sind.
Die Datei muss nur in ihrem Verzeichnis eindeutig sein.
Ein Gedanke, der mir in den Sinn kommt, ist die Verwendung File.createTempFile(String prefix, String suffix)
, aber das scheint falsch zu sein, da die Datei nicht temporär ist.
Der Fall von zwei Dateien, die in derselben Millisekunde erstellt wurden, muss behandelt werden.
Antworten:
Nun, Sie könnten die 3-Argument-Version verwenden, mit
File.createTempFile(String prefix, String suffix, File directory)
der Sie sie dort platzieren können, wo Sie möchten. Wenn Sie es nicht sagen, wird Java es nicht anders behandeln als jede andere Datei. Der einzige Nachteil ist, dass der Dateiname garantiert mindestens 8 Zeichen lang ist (mindestens 3 Zeichen für das Präfix plus 5 oder mehr von der Funktion generierte Zeichen).Wenn Ihnen das zu lang ist, können Sie wahrscheinlich immer mit dem Dateinamen "a" beginnen und "b", "c" usw. durchlaufen, bis Sie einen finden, der noch nicht vorhanden ist.
quelle
Ich würde die Apache Commons Lang-Bibliothek verwenden (http://commons.apache.org/lang ).
Es gibt eine Klasse
org.apache.commons.lang.RandomStringUtils
, mit der zufällige Zeichenfolgen mit einer bestimmten Länge generiert werden können. Sehr praktisch, nicht nur zur Generierung von Dateinamen!Hier ist das Beispiel:
String ext = "dat"; File dir = new File("/home/pregzt"); String name = String.format("%s.%s", RandomStringUtils.randomAlphanumeric(8), ext); File file = new File(dir, name);
quelle
Ich benutze den Zeitstempel
dh
new File( simpleDateFormat.format( new Date() ) );
Und lassen Sie das simpleDateFormat wie folgt initialisieren:
new SimpleDateFormat("File-ddMMyy-hhmmss.SSS.txt");
BEARBEITEN
Wie wäre es mit
new File(String.format("%s.%s", sdf.format( new Date() ), random.nextInt(9)));
Es sei denn, die Anzahl der in derselben Sekunde erstellten Dateien ist zu hoch.
Wenn das der Fall ist und der Name keine Rolle spielt
new File( "file."+count++ );
: P.
quelle
Das funktioniert bei mir:
String generateUniqueFileName() { String filename = ""; long millis = System.currentTimeMillis(); String datetime = new Date().toGMTString(); datetime = datetime.replace(" ", ""); datetime = datetime.replace(":", ""); String rndchars = RandomStringUtils.randomAlphanumeric(16); filename = rndchars + "_" + datetime + "_" + millis; return filename; }
// USE:
String newFile; do{ newFile=generateUniqueFileName() + "." + FileExt; } while(new File(basePath+newFile).exists());
Ausgabedateinamen sollten folgendermaßen aussehen:
2OoBwH8OwYGKW2QE_4Sep2013061732GMT_1378275452253.Ext
quelle
Schauen Sie sich das Datei-Javadoc an . Die Methode createNewFile erstellt die Datei nur, wenn sie nicht vorhanden ist, und gibt einen Booleschen Wert zurück, um anzugeben, ob die Datei erstellt wurde.
Sie können auch die Methode includes () verwenden:
int i = 0; String filename = Integer.toString(i); File f = new File(filename); while (f.exists()) { i++; filename = Integer.toString(i); f = new File(filename); } f.createNewFile(); System.out.println("File in use: " + f);
quelle
Wenn Sie Zugriff auf eine Datenbank haben, können Sie eine Sequenz im Dateinamen erstellen und verwenden.
Es ist garantiert einzigartig und sollte nicht zu groß werden (es sei denn, Sie pumpen eine Menge Dateien aus).
quelle
//Generating Unique File Name public String getFileName() { String timeStamp = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss").format(new Date()); return "PNG_" + timeStamp + "_.png"; }
quelle
File.createTempFile
unter der HaubeWenn Sie andere Antworten kombinieren, verwenden Sie den ms-Zeitstempel mit einem angehängten Zufallswert. Wiederholen, bis kein Konflikt mehr vorliegt, was in der Praxis so gut wie nie der Fall sein wird.
Zum Beispiel: Datei-ccyymmdd-hhmmss-mmm-rrrrrr.txt
quelle
Warum nicht einfach etwas verwenden, das auf einem Zeitstempel basiert?
quelle
Problem ist die Synchronisation. Konfliktregionen trennen.
Benennen Sie die Datei wie folgt:
(server-name)_(thread/process-name)_(millisecond/timestamp).(extension)
Beispiel:
aws1_t1_1447402821007.png
quelle
Wie wäre es mit einer Generierung basierend auf einem auf die nächste Millisekunde gerundeten Zeitstempel oder einer beliebigen Genauigkeit, die Sie benötigen? Verwenden Sie dann eine Sperre, um den Zugriff auf die Funktion zu synchronisieren.
Wenn Sie den zuletzt generierten Dateinamen speichern, können Sie nach Bedarf fortlaufende Buchstaben oder weitere Ziffern anhängen, um ihn eindeutig zu machen.
Wenn Sie dies lieber ohne Sperren tun möchten, verwenden Sie einen Zeitschritt plus eine Thread-ID und stellen Sie sicher, dass die Funktion länger als eine Millisekunde dauert, oder warten Sie, bis dies der Fall ist.
quelle
Es sieht so aus, als hätten Sie eine Handvoll Lösungen zum Erstellen eines eindeutigen Dateinamens, also lasse ich das in Ruhe. Ich würde den Dateinamen folgendermaßen testen:
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
quelle
Das funktioniert auch
String logFileName = new SimpleDateFormat("yyyyMMddHHmm'.txt'").format(new Date()); logFileName = "loggerFile_" + logFileName;
quelle
Ich verstehe, dass ich zu spät bin, um auf diese Frage zu antworten. Aber ich denke, ich sollte das sagen, da es etwas anderes zu sein scheint als andere Lösungen.
Wir können den Threadnamen und den aktuellen Zeitstempel als Dateinamen verketten. Es gibt jedoch ein Problem, bei dem ein Thread-Name ein Sonderzeichen wie "\" enthält, das Probleme beim Erstellen des Dateinamens verursachen kann. So können wir spezielle Zeichen aus dem Threadnamen entfernen und dann den Threadnamen und den Zeitstempel verketten
quelle
Warum nicht synchronisiert verwenden, um Multi-Thread zu verarbeiten. Hier ist meine Lösung: Sie kann einen kurzen Dateinamen generieren und ist einzigartig.
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'};
geblasen ist die Hauptfunktion für den Test, es ist Arbeit.
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()); }
quelle
Ich benutze aktuelle Millisekunden mit Zufallszahlen
dh
Random random=new Random(); String ext = ".jpeg"; File dir = new File("/home/pregzt"); String name = String.format("%s%s",System.currentTimeMillis(),random.nextInt(100000)+ext); File file = new File(dir, name);
quelle