2017-01-18 16 views
2

Если я передаю GeoTiffReader экземпляр File, который был помечен как deleteOnExit(), этот файл не будет удален при выходе.GeoTiffReader предотвращает deleteOnExit

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

Чтобы изолировать проблему, я попробовал версию без GeoTiffReader, который работает, как ожидалось:

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

Я подозреваю, GeoTiffReader не отпуская дескриптор файла на выходе. Полный код:

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); 
    } 
} 

ответ

1

Чтобы устранить проблему, я считаю, что вам нужно избавиться от планаримажа. Используя код в качестве примера,

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); 
} 

Это должно удалить ваш GeoTiffFile при выходе.

1

Вы должны dispose() о наличии GridCoverageReader так, что у него есть шанс, чтобы освободить лежащие в основе inputStream, который будет препятствовать мозг мертвой операционной системы удаляемого файл позже.

+0

Хорошая оболочка ответа, но Джастин Л'с более совершенен. Windows - мертвый мозг. – spt5007

+0

Я уверен, что вам нужно только избавиться от читателя –