GeoTiffReader 阻止 deleteOnExit
GeoTiffReader prevents 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);
}
}
您需要 dispose()
GridCoverageReader,以便它有机会释放底层 inputStream
,这将防止脑死亡操作系统稍后删除文件。
要解决您的问题,我相信您需要处理平面图像。以您的代码为例,
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。
如果我向 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);
}
}
您需要 dispose()
GridCoverageReader,以便它有机会释放底层 inputStream
,这将防止脑死亡操作系统稍后删除文件。
要解决您的问题,我相信您需要处理平面图像。以您的代码为例,
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。