2011-09-25 10 views
5

He hecho un programa Java en Eclipse. Empecé con Windows XP, pero recientemente me actualicé.¿Por qué mi programa no puede eliminar los archivos que crea en Win7?

Como parte de su mecanismo de guardado, el programa escribe las configuraciones en un archivo settings_new.sav. Si eso va bien, elimina el settings.sav y cambia el nombre del nuevo para que coincida con el nombre anterior. Mientras funcionaba en winXP (al menos eso pensé que era, pero no puedo verificarlo ahora), en win7, no se borra el archivo, aunque fue el programa que lo creó (aunque es una instancia diferente del programa).)

El archivo es recogido por Eclipse y se puede eliminar desde allí con bastante alegría. Puedo borrarlo manualmente Soy el administrador en mi propia computadora. La carpeta está dentro de la carpeta del espacio de trabajo y no está en Archivos de programa (aunque no tengo idea de si los usuarios eventuales la instalarán allí). El programa puede crear y modificar archivos muy bien. No está lanzando ninguna Excepción, lo que pensé que sería si fuera win7 bloqueándola.

¿Alguna idea?

Respuesta

9

Se debe al mecanismo de bloqueo de archivos en Java. Asegúrese de cerrar las secuencias de almacenamiento en búfer como BufferedReader, BufferedInputStream en ese archivo cuando haya terminado.

+0

En realidad, es el mecanismo de bloqueo de archivos en Windows. El mismo código probablemente funcionaría bien en Linux. Pero estoy de acuerdo, debe cerrar explícitamente el acceso al archivo para que funcione correctamente en todas partes. –

+0

@MarkRobinson: Interesante, también debería probar mis aplicaciones de swing en Linux. Parece que los desarrolladores deben anticipar problemas en el nivel de sistema operativo en lugar de en JVM. – PraveenMax

+1

Windows y Linux tienen una semántica de bloqueo de archivos diferente. Linux le permitirá eliminar un archivo que haya abierto para su edición sin explotar. A continuación, puede crear un nuevo archivo con el mismo nombre sin problemas. En Windows, puede evitar que elimine un archivo si está abierto en otro proceso. Las situaciones específicas que esto sucede dependen en gran medida de cómo se abre (por método/y tipo de acceso). Si tiene más preguntas, le sugiero que publique una nueva pregunta SO dirigida a los chicos de Windows :) –

-3

Yo solía tener este problema, cuando haya terminado de usar su archivo, tiene que establecer su archivo igual a nulo. Así que si haces algo como:

public void createFile(String path) 
{ 
    File file = new File(path); 
    file.createNewFile(); 
    file = null 
} 

tiene que configurar el archivo a nula cuando haya terminado de usarlo para que el sistema deja de usar ese archivo. tienes que hacer lo mismo con FileReader y FileWriter. tiene que configurar los lectores de archivos y los escritores de archivos para que anulen para volver a acceder al archivo. Pruébalo y cuéntame cómo funciona.

+2

Eso no va a funcionar. Todo lo que hará es permitir que el recolector de basura de Java lo recoja más tarde. Más tarde indefinido. Debería cerrar explícitamente el acceso al archivo en lugar de esperar a que el recolector de elementos no utilizados lo obtenga. –

+0

eso es lo que lo establece en null, cuando configura algo para anular java automáticamente recoge basura. – gsfd

+2

Significa que está disponible para colección, no que la colección ocurra instantáneamente. Podría, pero es un comportamiento muy específico de JVM. –

Cuestiones relacionadas