2017-01-18 1 views
2

Si je passe à GeoTiffReader une instance de fichier qui a été marquée comme deleteOnExit() ce fichier ne sera pas supprimé à la sortie.GeoTiffReader empêche deleteOnExit

File geotiffFile = Paths.get("geotools-test.tiff").toFile(); 
geotiffFile.deleteOnExit(); 
GeoTiffReader reader = new GeoTiffReader(geotiffFile); 
reader.read(null); 

Pour isoler le problème que j'ai essayé une version sans GeoTiffReader qui fonctionne comme prévu:

File geotiffFile = Paths.get("geotools-test.tiff").toFile(); 
geotiffFile.deleteOnExit(); 
Files.readAllBytes(geotiffFile.toPath()); 

Je soupçonne GeoTiffReader ne libère pas le handle de fichier à la sortie. Code complet:

import java.io.File; 
import java.io.IOException; 
import java.nio.file.Paths; 

import org.geotools.gce.geotiff.GeoTiffReader; 

public class GeoTiffReaderLingeringHandles 
{ 
    public static void main(String[] args) 
     throws IOException 
    { 
     main_working(args); 
     // main_broken(args); 
    } 

    public static void main_working(String[] args) 
     throws IOException 
    { 
     File geotiffFile = Paths.get("geotools-test.tiff").toFile(); 
     geotiffFile.deleteOnExit(); 
    } 

    public static void main_broken(String[] args) 
     throws IOException 
    { 
     File geotiffFile = Paths.get("geotools-test.tiff").toFile(); 
     geotiffFile.deleteOnExit(); 
     GeoTiffReader reader = new GeoTiffReader(geotiffFile); 
     reader.read(null); 
    } 
} 

Répondre

1

Pour résoudre votre problème, je crois que vous devez vous débarrasser de la planarimage. En utilisant votre code comme exemple,

public static void main_broken(String[] args) 
    throws IOException 
{ 
    File geotiffFile = Paths.get("geotools-test.tiff").toFile(); 
    geotiffFile.deleteOnExit(); 
    GeoTiffReader reader = new GeoTiffReader(geotiffFile); 
    GridCoverage2D result = reader.read(null); 
    PlanarImage planarImage = (PlanarImage) result.getRenderedImage(); 
    ImageUtilities.disposePlanarImageChain(planarImage); 
} 

Cela devrait supprimer votre GeoTiffFile à la sortie.

1

Vous devez dispose() d'un GridCoverageReader pour qu'il ait une chance de libérer le inputStream sous-jacente qui empêcherait un système d'exploitation mort cérébrale supprimer le fichier plus tard.

+0

Bonne coquille de réponse mais Justin L est plus complet. Windows est mort cérébrale. – spt5007

+0

Je suis à peu près sûr qu'il ne vous reste plus qu'à disposer du lecteur de couverture –