Input/Output Datei noch geöffnet trotz Close

bandit

Mitglied
Hallo Forum,

ich habe mir einen Beispielcode zum Konvertieren eines PDF in Tiff heruntergeladen. Das Tiff wird auch erstellt aber die Datei ist anschließend im Explorer nicht löschbar so lange der WAS Server Prozess noch läuft weil sie noch geöffnet ist.

Java:
protected static void convert(BufferedImage[] image, String tif, int dpi, int compression, float quality) throws IOException {

		File file = new File(tif);

		if (file.exists()) {
			file.delete();
		}

		RandomAccessFile raf = new RandomAccessFile(file, "rw");
		FileChannelImageOutputStream fios = new FileChannelImageOutputStream(raf.getChannel());

		convert(image, fios, dpi, compression, quality);

		fios.flush();
		fios.close();
		raf.close();
	}

Java:
protected static void convert(BufferedImage[] image, Object os, int dpi, int compression, float quality) throws IOException {

		TIFFImageWriter writer = new TIFFImageWriter(new TIFFImageWriterSpi());
		TIFFImageWriteParam iwp = new TIFFImageWriteParam(writer.getLocale());

		writer.setOutput(os);
		writer.prepareWriteSequence(null);

		iwp.setCompressionMode(TIFFImageWriteParam.MODE_EXPLICIT);
		iwp.setCompressionType(getCompression(compression));

		if (!isCompressionLossless(compression)) {
			if (quality < 0.0F || quality > 1.0F)
				quality = DEFAULT_COMPRESSION_QUALITY;
			iwp.setCompressionQuality(quality);
		}

		for (int i = 0; i < image.length; i++) {
			ImageTypeSpecifier imageType = ImageTypeSpecifier.createFromRenderedImage(image[i]);
			TIFFImageMetadata imageMetadata = (TIFFImageMetadata) writer.getDefaultImageMetadata(imageType, iwp);
			imageMetadata = createImageMetadata(imageMetadata, image[i].getHeight(), image[i].getWidth(), dpi, compression, image[i].getType());
			writer.writeToSequence(new IIOImage(image[i], null, imageMetadata), iwp);
		}

		writer.endWriteSequence();
		writer.dispose();
	}
 
Medhode close() von FileChannelImageOutputStream:

"Invokes the superclass method, writes any unwritten data, and sets the internal reference to the source FileChannel to null."

Also musst Du den FileChannel voher schliessen:
Java:
fios.flush();
raf.close();
fios.close();
 
ok, wird ja nur die interne Referenz gelöscht.
hätte ja ansonsten schon vorher eine Nullpointerex. geworfen.

schätze mal, Du musst den TIFFImageWriter schließen ( writer close() ) , der anscheinend die Ressource "festhält". ?
 

Zurück
Oben