【问题标题】:GeoTiffReader prevents deleteOnExitGeoTiffReader 防止 deleteOnExit
【发布时间】:2017-01-18 15:34:38
【问题描述】:

如果我向 GeoTiffReader 传递一个已标记为 deleteOnExit() 的 File 实例,该文件将不会在退出时被删除。

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

【问题讨论】:

    标签: java geotools geotiff


    【解决方案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。

    【讨论】:

      【解决方案2】:

      您需要 dispose() 的 GridCoverageReader 以便它有机会释放底层的 inputStream,这将防止脑死亡的操作系统稍后删除文件。

      【讨论】:

      • 答案的外壳很好,但贾斯汀 L 的更完整。 Windows 脑死了。
      • 我很确定你只需要处理覆盖阅读器
      猜你喜欢
      • 2013-10-01
      • 2015-05-12
      • 2012-07-03
      • 1970-01-01
      • 1970-01-01
      • 2019-02-10
      • 2014-10-25
      • 2013-01-27
      • 2012-10-28
      相关资源
      最近更新 更多