2012-03-07 40 views
24

Necesito crear un archivo temporal, así que probamos este:¿Cómo crear un archivo temporal en Java sin el número aleatorio agregado al nombre de archivo?

String[] TempFiles = {"c1234c10","c1234c11","c1234c12","c1234c13"}; 
for (int i = 0; i <= 3; i++) { 
    try { 
     String tempFile = TempFiles[i]; 
     File temp = File.createTempFile(tempFile, ".xls"); 
     System.out.println("Temp file : " + temp.getAbsolutePath()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

La salida es algo como esto:

Temp file : C:\Users\MD1000\AppData\Local\Temp\c1234c108415816200650069233.xls 
Temp file : C:\Users\MD1000\AppData\Local\Temp\c1234c113748833645638701089.xls 
Temp file : C:\Users\MD1000\AppData\Local\Temp\c1234c126104766829220422260.xls 
Temp file : C:\Users\MD1000\AppData\Local\Temp\c1234c137493179265536640669.xls 

Ahora, no quiero que los números adicionales (long int) que se está agregando al nombre del archivo. ¿Cómo puedo lograr eso? Gracias

Respuesta

28

En primer lugar, utilizar el siguiente fragmento de obtener el directorio temporal del sistema:

String tDir = System.getProperty("java.io.tmpdir"); 

A continuación, utilice la variable tDir en conjunto con la matriz tempFiles[] para crear cada archivo individualmente.

+0

Gracias! Funcionó. –

+2

¿Se borrarán automáticamente todos estos archivos creados manualmente al salir? (Supongo que sí, pero solo para asegurarse, si alguien puede confirmar). – Larry

+4

Simplemente tenga en cuenta que si hace esto, no está utilizando File.createTempFile, sino de alguna otra manera de crear el archivo. – JohnK

4

Si desea crear archivos con nombres específicos en el directorio temporal de todo el sistema, expanda la variable de entorno %temp% y cree el archivo manualmente, nada de malo en eso.

Editar: En realidad, use System.getProperty("java.io.tmpdir")); para eso.

+1

que establecerá la ubicación del archivo temporal, pero no va a dar cuenta de los números adicionales insertados en el nombre del archivo. – jmq

+1

Creo que nunca leyó mi respuesta por completo. – Irfy

+1

Lo leí. Yo malentendí tu respuesta. – jmq

15

No se puede si usa File.createTempFile para generar un nombre de archivo temporal. Miré a la fuente de Java para generar un archivo temporal (para Java 1.7, que no declaró su versión de lo que sólo se usa la mina):

private static class TempDirectory { 
    private TempDirectory() { } 

    // temporary directory location 
    private static final File tmpdir = new File(fs.normalize(AccessController 
     .doPrivileged(new GetPropertyAction("java.io.tmpdir")))); 
    static File location() { 
     return tmpdir; 
    } 

    // file name generation 
    private static final SecureRandom random = new SecureRandom(); 
    static File generateFile(String prefix, String suffix, File dir) { 
     long n = random.nextLong(); 
     if (n == Long.MIN_VALUE) { 
      n = 0;  // corner case 
     } else { 
      n = Math.abs(n); 
     } 
     return new File(dir, prefix + Long.toString(n) + suffix); 
    } 
} 

Este es el código en el JDK de Java que genera el archivo temporal nombre. Puede ver que genera un número aleatorio y lo inserta en su nombre de archivo entre su prefijo y su sufijo. Esto está en "File.java" (en java.io). No vi ninguna forma de cambiar eso.

0

nombres personalizados se pueden guardar como sigue

File temp=new File(tempFile, ".xls"); 
if (!temp.exists()) { 
    temp.createNewFile(); 
} 
+0

Agradable y simple. – huahsin68

+0

Votación descendente. La llamada a 'temp.exists()' introduce una condición de carrera que 'temp.createNewFile()' fue específicamente diseñada para evitar. Simplemente verifique el valor de retorno de 'temp.createNewFile()'. Lea la especificación de 'createNewFile()'. La palabra importante es * atómica *. https://docs.oracle.com/javase/7/docs/api/java/io/File.html#createNewFile%28%29 –

3

Usando Guava:

import com.google.common.io.Files; 

... 

File myTempFile = new File(Files.createTempDir(), "MySpecificName.png"); 
+0

¡Gracias por salvarme el día! – realPK

0

Se puede crear un directorio temporal y luego almacenar nuevos archivos en ella. De esta forma, todos los archivos nuevos que agregue no tendrán una extensión aleatoria. Cuando haya terminado, todo lo que tiene que hacer es eliminar el directorio temporal que ha agregado.

public static File createTempFile(String prefix, String suffix) {  
    File parent = new File(System.getProperty("java.io.tmpdir")); 

    File temp = new File(parent, prefix + suffix); 

    if (temp.exists()) { 
     temp.delete(); 
    } 

    try { 
     temp.createNewFile(); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 

    return temp; 
} 


public static File createTempDirectory(String fileName) {  
    File parent = new File(System.getProperty("java.io.tmpdir")); 

    File temp = new File(parent, fileName); 

    if (temp.exists()) { 
     temp.delete(); 
    } 

    temp.mkdir(); 

    return temp; 
} 
0
public static File createTempDirectory(String dirName) { 
     File baseDir = new File(System.getProperty("java.io.tmpdir")); 
     File tempDir = new File(baseDir, dirName); 
     if (tempDir.mkdir()) { 
      return tempDir; 
     } 
     return null; 
} 
+1

Agregar alguna explicación para el código sería útil para el OP. – SANM2009

+0

Gracias por este fragmento de código, que podría proporcionar alguna ayuda limitada a corto plazo. Una explicación adecuada [mejoraría en gran medida] (// meta.stackexchange.com/q/114762) su valor a largo plazo mostrando * why * esta es una buena solución al problema, y ​​lo haría más útil para los lectores futuros con otras preguntas similares. Por favor [edite] su respuesta para agregar alguna explicación, incluidas las suposiciones que ha hecho. –

Cuestiones relacionadas