zawalnianie objektu -zajety plik

0

Mam nastepujacy problem ze zwolnieniem objektu pliku w aplecie
Tworze objekt klasy , ktora slozy do zmiany rozdzielczości pliku -(ponizej podam jej kod) wstandardowy sposob:

ImageManipulation rozdz = new ImageManipulation();
rozdz.zmien_rozdzielczosc("plik.jpg");

po wykonaniu tej kalasy program jeszcze sie nie konczy - jednak nie zwalnia mi sie plik.jpg - gdy chce go usunac w systmie mam komunikat ze plik jest zajety przez program. W zaden sposob nie moge go zwolnic ani usunac - nie dzilaja tez funkcje usuwania pliku.

probowalem:
rozdz=null
System.gc

ale nic nie pomoglo
Proszę o pomoc

Ponizej kalsa ImageManipulation

import java.awt.;
import java.awt.image.
;
import java.io.;
import java.net.
;
import javax.imageio.*;

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.awt.Image;

import java.io.File;
import java.io.FileOutputStream;

import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.stream.FileImageInputStream;
import javax.swing.ImageIcon;

import org.w3c.dom.Element;
import org.w3c.dom.Node;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

public class ImageManipulation {

public void zmien_rozdzielczosc(String nazwa_pl) throws Exception {

    File infile = new File(nazwa_pl);
    File outfile = new File("c:/plik/pr/pliki_po_konwersji/"+nazwa_pl);

    ImageReader reader = ImageIO.getImageReadersByFormatName("jpeg").next();
    reader.setInput(new FileImageInputStream(infile), true, false);
    IIOMetadata data = reader.getImageMetadata(0);
	BufferedImage image = reader.read(0);
	
	int a = image.getWidth(null);
        int b = image.getHeight(null);
	int w = 600, h = -1;
	
	if (a>b){
	w = 600;
	h = -1;}
	
	if (b>a){
	w = -1;
	h = 900;}

     Image rescaled = image.getScaledInstance(w, h, Image.SCALE_AREA_AVERAGING);
     BufferedImage output = toBufferedImage(rescaled, BufferedImage.TYPE_INT_RGB);
	 

	FileOutputStream fos = new FileOutputStream(outfile);
    JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(fos);
    JPEGEncodeParam jpegEncodeParam = jpegEncoder.getDefaultJPEGEncodeParam(output);
    jpegEncodeParam.setDensityUnit(JPEGEncodeParam.DENSITY_UNIT_DOTS_INCH);
    jpegEncodeParam.setXDensity(300);
    jpegEncodeParam.setYDensity(300);
    jpegEncoder.encode(output, jpegEncodeParam);
	fos.close();
	}

  public static BufferedImage toBufferedImage(Image image, int type) {
        int w = image.getWidth(null);
        int h = image.getHeight(null);
        BufferedImage result = new BufferedImage(w, h, type);
        Graphics2D g = result.createGraphics();
        g.drawImage(image, 0, 0, null);
        g.dispose();
        return result;
    }

}

0

U mnie akurat to działa normalnie i mogę usunąć co chcę, ale pewnie to przez ubuntu.
Spróbuj dać coś takiego...

FileImageInputStream is = new FileImageInputStream(infile);
reader.setInput(is, true, false);
IIOMetadata data = reader.getImageMetadata(0);
BufferedImage image = reader.read(0);
is.close(); //...i zamknąć input stream :)
0

Tak masz rację. Zrobilem to co mi kazałes i dziła. To są moje pocztki w javie wiec wybacz, że nie wiedzialem tego. Bardzo mi pomogłeś - sam meczyłem sie nad tym kilka dni i nic. Dziekuje jeszcze raz i pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1