flor de jeff
No necesariamente quiero usar UUID ya que son bastante largos.
El archivo solo necesita ser único dentro de su directorio.
Un pensamiento que me viene a la mente es usar File.createTempFile(String prefix, String suffix)
pero eso parece incorrecto porque el archivo no es temporal.
Es necesario manejar el caso de dos archivos creados en el mismo milisegundo.
pesto
Bueno, podrías usar la versión de 3 argumentos: File.createTempFile(String prefix, String suffix, File directory)
que te permitirá ponerlo donde quieras. A menos que usted se lo indique, Java no lo tratará de manera diferente a cualquier otro archivo. El único inconveniente es que se garantiza que el nombre del archivo tenga al menos 8 caracteres (mínimo de 3 caracteres para el prefijo, más 5 o más caracteres generados por la función).
Si eso es demasiado largo para usted, supongo que siempre puede comenzar con el nombre de archivo “a” y recorrer “b”, “c”, etc. hasta que encuentre uno que aún no existe.
-
Pero, ¿garantizaría la unicidad entre múltiples ejecuciones del programa?
– Reddy
24 de septiembre de 2012 a las 11:41
-
De acuerdo con los documentos, garantizará que (1) el archivo indicado por la ruta de acceso abstracta devuelta no existía antes de que se invocara este método, y (2) ni este método ni ninguna de sus variantes devolverá la misma ruta de acceso abstracta nuevamente en el invocación actual de la máquina virtual. Entonces, si está creando archivos en el mismo directorio, y no los está eliminando, sí, serían únicos.
– SpikeWilliams
20 de noviembre de 2013 a las 2:27
-
¿elimina el archivo después de cerrar? o tienes que borrarlo cuando termines con el?
– Suerte
14 de junio de 2019 a las 10:52
-
Tienes que borrar el archivo. Archivo testFile = File.createTempFile(“MyApp”, “.tmp”, outputDirectory); testFile.delete();
– Alquimista mate
28 de junio de 2019 a las 21:17
-
@Lucke deleteOnExit()
– lainatnavi
29 de junio de 2020 a las 13:44
Usaría la biblioteca Apache Commons Lang (http://commons.apache.org/lang).
hay una clase org.apache.commons.lang.RandomStringUtils
que se puede usar para generar cadenas aleatorias de longitud dada. ¡Muy útil no solo para la generación de nombres de archivo!
Aquí está el ejemplo:
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);
-
@marcolopes: Pero las posibilidades de nombres iguales para dos archivos son extremadamente pequeñas. En caso de que tengamos 62 caracteres diferentes (no sé cuántos RandomStringUtils usan; 62 es mi suposición para distinguir entre mayúsculas y minúsculas) es 62 ^ n donde n es la longitud de su nombre de archivo. Para el ejemplo anterior con una longitud de 8, la probabilidad sería 2,183401056 × 10¹⁴.
– Kris
7 oct 2014 a las 16:33
-
Sin embargo, @Kris aún así, con unas pocas líneas de código, podría tener una garantía del 100% de exclusividad (o simplemente usando uno de los métodos existentes).
– xorinzor
22 de agosto de 2017 a las 21:13
-
Esta no es una forma idiomática. Será mejor que lo evites. Use archivos temporales, como se sugiere.
– Alejandro Pozdneev
12 de julio de 2018 a las 19:29
-
¿Incluir otra biblioteca en conjunto en el proyecto solo para generar un nombre de archivo aleatorio? No es una solución viable, digo.
– aturdidor
7 de enero de 2020 a las 10:16
oscarryz
yo uso la marca de tiempo
es decir
new File( simpleDateFormat.format( new Date() ) );
Y tenga el simpleDateFormat inicializado en algo como:
new SimpleDateFormat("File-ddMMyy-hhmmss.SSS.txt");
EDITAR
Qué pasa
new File(String.format("%s.%s", sdf.format( new Date() ),
random.nextInt(9)));
A menos que la cantidad de archivos creados en el mismo segundo sea demasiado alta.
Si ese es el caso y el nombre no importa
new File( "file."+count++ );
:PAGS
-
Sí, pero ¿qué sucede si se crean dos archivos en el mismo segundo o milisegundo?
–Jeff Bloom
5 mayo 2009 a las 16:21
-
milisegundos no es probable, y podría ponerle un temporizador para detener la creación de archivos en el mismo segundo…
– jesses.co.tt
16 de julio de 2014 a las 20:16
-
@JeffBloom He encontrado un problema similar al que estás preguntando. Estoy creando un archivo y el nombre del archivo tiene System.currentTimeMillis(). Supongamos que copio el archivo y pego otro archivo con el mismo System.currentTimeMillis(), no leerá mi próximo archivo. ¿Cómo no puedo permitir que el usuario copie y pegue archivos que tienen el mismo System.currentTimeMillis()? Cualquier ayuda sería muy apreciada
– usuario8412632
10 de febrero de 2018 a las 5:42
MARYLAND. Mohiuddin Ahmed
Esto funciona para mí:
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());
Los nombres de los archivos de salida deberían verse así:
2OoBwH8OwYGKW2QE_4Sep2013061732GMT_1378275452253.Ext
pgras
mira el Archivo javadocel método createNewFile creará el archivo solo si no existe y devolverá un valor booleano para indicar si se creó el archivo.
También puedes usar el método exist():
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);
-
No sé si lo estoy pensando demasiado. ¿Qué sucede si otro proceso crea f después del bucle while y antes de la llamada a f.createNewFile()?
– Guangliang
7 de diciembre de 2017 a las 14:42
Shane
Si tiene acceso a una base de datos, puede crear y utilizar una secuencia en el nombre del archivo.
select mySequence.nextval from dual;
Se garantizará que sea único y no debería ser demasiado grande (a menos que esté bombeando una tonelada de archivos).
-
No sé si lo estoy pensando demasiado. ¿Qué sucede si otro proceso crea f después del bucle while y antes de la llamada a f.createNewFile()?
– Guangliang
7 de diciembre de 2017 a las 14:42
//Generating Unique File Name
public String getFileName() {
String timeStamp = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss").format(new Date());
return "PNG_" + timeStamp + "_.png";
}
-
El método anterior no garantiza que dos llamadas rápidas (o dos subprocesos diferentes al mismo tiempo) arrojen resultados únicos.
– usr-local-ΕΨΗΕΛΩΝ
6 de junio de 2018 a las 12:23
-
@usr-local-ΕΨΗΕΛΩΝ también puede agregar la identificación de usuario para que ese nombre de archivo sea único y sobre el hilo podemos usar rxJava para eso
– LEYENDA MORTAL
7 de junio de 2018 a las 14:42
-
Lo siento, debo estar totalmente en desacuerdo. Dos hilos del mismo usuario chocarán. Y su API debe requerir que los implementadores recopilen la identificación del usuario. Java es famoso por ser portátil, ¿qué sucede si su voz se ejecuta en un dispositivo IoT sin usuario? La forma correcta es realizar un ciclo for agregando un sufijo creciente hasta que no se encuentre ningún archivo con ese sufijo y crear inmediatamente ese archivo. Esto es lo mismo
File.createTempFile
hace bajo el capó– usr-local-ΕΨΗΕΛΩΝ
7 junio 2018 a las 15:03
No prestes demasiada atención a la parte “Temp” del nombre; lea javadocs para ver que en realidad se trata más de la singularidad, que a menudo se necesita para los archivos temporales. Pero no necesariamente solo para ellos.
– StaxMan
5 mayo 2009 a las 16:50