Hallo,
ich lege für eine Operation ein Temp-File an, das ich nach Beenden des Programms gerne wieder löschen würde. Hierzu habe ich die Methode File.deleteOnExit() gefunden. Diese funktioniert allerdings nicht, das Temp-File wird nicht gelöscht.
Was mache ich falsch?
Hier eine Beispielanwendung die das Problem demonstriert
ich lege für eine Operation ein Temp-File an, das ich nach Beenden des Programms gerne wieder löschen würde. Hierzu habe ich die Methode File.deleteOnExit() gefunden. Diese funktioniert allerdings nicht, das Temp-File wird nicht gelöscht.
Was mache ich falsch?
Hier eine Beispielanwendung die das Problem demonstriert
Java:
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.DataBuffer;
import java.awt.image.DirectColorModel;
import java.awt.image.SampleModel;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.IntBuffer;
import java.nio.channels.FileChannel;
import javax.imageio.ImageIO;
import javax.imageio.stream.FileImageOutputStream;
import javax.swing.JPanel;
import org.openide.util.Exceptions;
public class Test {
public static void main(String[] argv) {
Test test = new Test();
test.createAndDeleteTempFile();
}
public void createAndDeleteTempFile() {
try {
JPanel panel = new JPanel();
panel.setSize(800, 600);
int w = panel.getBounds().width;
int h = panel.getBounds().height;
File file2 = File.createTempFile("tempfile", "tmp");
file2.deleteOnExit(); // THIS DOES NOT WORK
FileChannel rwChannel = new RandomAccessFile(file2, "rw").getChannel();
ByteBuffer wrBuf = rwChannel.map(FileChannel.MapMode.READ_WRITE, 0, 6 * w * h);
IntBuffer iBuf = wrBuf.asIntBuffer();
DataBufferSubClass db = new DataBufferSubClass(DataBuffer.TYPE_INT, 3 * h * w);
db.setWrBuf(iBuf);
ColorModel cm = new DirectColorModel(24, 0x00ff0000, 0x0000ff00, 0x000000ff);
SampleModel sm = cm.createCompatibleSampleModel(w, h);
WritableRaster wr = new MyWritableRaster(sm, db, new Point(0, 0));
BufferedImage bim = new BufferedImage(cm, wr, true, null);
Graphics2D g = bim.createGraphics();
panel.paint(g);
FileImageOutputStream fo = new FileImageOutputStream(
new File(System.getProperty("user.dir")+
System.getProperty("file.separator")+"out.png"));
ImageIO.write(bim, "" + "PNG", fo);
} catch (IOException ex) {
Exceptions.printStackTrace(ex);
}
}
public class DataBufferSubClass extends DataBuffer {
private IntBuffer wrBuf;
public void setWrBuf(IntBuffer wrBuf) {
this.wrBuf = wrBuf;
}
public DataBufferSubClass(int dataType, int size) {
super(dataType, size);
}
public DataBufferSubClass(int dataType, int size, int numBanks) {
super(dataType, size, numBanks);
}
public DataBufferSubClass(int dataType, int size, int numBanks, int offset) {
super(dataType, size, numBanks, offset);
}
public DataBufferSubClass(int dataType, int size, int numBanks, int[] offsets) {
super(dataType, size, numBanks, offsets);
}
@Override
public int getElem(int bank, int i) {
return wrBuf.get(i);
}
@Override
public void setElem(int bank, int i, int val) {
wrBuf.put(i, val);
}
}
public class MyWritableRaster extends WritableRaster {
public MyWritableRaster(SampleModel sampleModel, DataBuffer dataBuffer, Point origin) {
super(sampleModel, dataBuffer, origin);
}
}
}