2012-04-01 13 views
5

El siguiente código no siempre crea el archivo. Por lo que he notado, la primera vez que se ejecutó este código, aunque no se lanzó ninguna excepción y se creóFileSucceeded == true, el archivo no se crea.Java file.createNewFile no se creó el archivo y no se lanzaron excepciones

que ejecuta el código en Windows, Java 6.

Cualquier entrada puede ser útil

File file = new File(tmpDir, fileName); 

try { 
if (tmpDir == null) { 
    String environmentHomePath // = somePath; 
    tmpDir = new File(environmentHomePath, "SampleDumps"); 

    if (! tmpDir.exists() || ! tmpDir.isDirectory()) { 
    boolean mkdirSucceeded = tmpDir.mkdir(); 
    if (! mkdirSucceeded) { 
     throw new IOException("Failed creating directory: '" + tmpDir.getAbsolutePath() + "'"); 
    } 
    } 
} 

if (file.exists()) { 
    boolean deleteFileSucceeded = file.delete(); 
    if (! deleteFileSucceeded) { 
    throw new IOException("Unable to delete pre existing sample file: '" + fileName + "'"); 
    } 
} 

boolean createFileSucceeded = file.createNewFile(); 
if (! createFileSucceeded) { 
    throw new IOException("Unable to create sample file: '" + fileName + "'"); 
} 

fw = new FileWriter(file); 
bw = new BufferedWriter(fw); 

StringBuilder sb = new StringBuilder("something..."); 

bw.write(sb.toString()); 
bw.flush(); 
} 
catch (IOException ioe) { 
log.warn("Unable to file invalid sample to file: '" + fileName + "'", ioe); 
} 
finally { 
if (bw != null) { 
    try { 
    bw.close(); 
    } catch (IOException e) { 
    log.warn("Unable to close Writer to file: '" + fileName + "'", e); 
    } 
} 
else if (fw != null) { 
    try { 
    fw.close(); 
    } catch (IOException e) { 
    log.warn("Unable to close Writer to file: '" + fileName + "'", e); 
    } 
} 
} 
+0

tal vez el usuario que ejecuta la aplicación no tiene suficientes privilegios para crear un archivo en ese directorio –

+0

@LuiggiMendoza pero ejecuta el código, consecutivamente, dentro del mismo proceso, por segunda vez crea el archivo. –

+1

No he intentado ejecutar su código, pero sospecho que crear el tmpDir después de crear el archivo que espera existir en ese directorio puede estar causando un comportamiento inesperado de los métodos de archivo como exists(). – GreyBeardedGeek

Respuesta

6

Si file.createNewFile() vuelve true entonces se creó un archivo.

La explicación más probable es que el archivo se está creando, pero no en el lugar donde se espera. Espero que usted está utilizando una ruta relativa para el archivo ...


Mirando con más atención a su código y su comentario, creo que eso es exactamente lo que está sucediendo. Eche un vistazo a la forma en que crea el directorio temporal. Primero construye el archivo usando tmpdir como el directorio padre. Luego, pruebe para ver si tmpdir es null y cree un directorio. ¡Pero luego procede a usar el objeto File que STILL tiene un directorio padre null!

Debe crear el objeto File DESPUÉS de comprobar tmpdir y crearlo si es necesario.

2

Su enfoque relacionado con tmpDir es defectuoso. El archivo se está creando en algún lugar.

De los Javadocs para File(String, String):

Si el padre es nulo, la nueva instancia del archivo se crea como si invocando el constructor de archivos de un solo argumento en la cadena de ruta determinado niño.

2

Después de algunas pruebas, he encontrado el error y corregirlo:

try { 
    //create tmpDir if its null 
    if (tmpDir == null) { 
     String environmentHomePath = "D:/"; //change to somepath 
     //tmpDir must be a directory path 
     tmpDir = new File(environmentHomePath); 

     if (!tmpDir.exists() || !tmpDir.isDirectory()) { 
      boolean mkdirSucceeded = tmpDir.mkdir(); 
      if (!mkdirSucceeded) { 
       throw new IOException("Failed creating directory: '" + tmpDir.getAbsolutePath() + "'"); 
      } 
     } 
    } 
    //create the path 
    File file = new File(tmpDir, fileName); 
    if (file.exists()) { 
     boolean deleteFileSucceeded = file.delete(); 
     if (!deleteFileSucceeded) { 
      throw new IOException("Unable to delete pre existing sample file: '" + fileName + "'"); 
     } 
    } 
    boolean createFileSucceeded = file.createNewFile(); 
    if (!createFileSucceeded) { 
     throw new IOException("Unable to create sample file: '" + fileName + "'"); 
    } 

    fw = new FileWriter(file); 
    bw = new BufferedWriter(fw); 

    StringBuilder sb = new StringBuilder("something..."); 
    bw.write(sb.toString()); 
    bw.flush(); 
} catch (IOException ioe) { 
    log.warn("Unable to file invalid sample to file: '" + fileName + "'", ioe); 
} finally { 
    try { 
    if (bw != null) { 
     try { 
      bw.close(); 
     } catch (IOException e) { 
      log.warn("Unable to close Writer to file: '" + fileName + "'", e); 
     } 
    } 
    else if (fw != null) { 
     try { 
      fw.close(); 
     } catch (IOException e) { 
      log.warn("Unable to close Writer to file: '" + fileName + "'", e); 
    } 
} 
+0

@BrianRoach He hecho mi prueba cuando no hubo respuestas, y he votado por StephenC porque fue el primero en encontrar el problema –

0

verificar el nombre de archivo. No debe contener ningún punto : o cualquier otro carácter similar, lo que arroja una excepción.

Cuestiones relacionadas