Scheinbar zufällig hin und wieder: Can't create an ImageOutputStream!

Voldemort92

Mitglied
Moin moin!

Ich habe gerade folgendes Problem:
Ich habe mehrere BufferedImages, welche ich nacheinander (nicht unmittelbar nacheinander, eher im Abstand von ca. 1 Sekunde) per writeImage (siehe unten) in die selbe File schreibe. An sich klappt das auch, das Problem besteht darin, dass hin und wieder (manchmal nach 20 BufferedImages, mal erst nach 200) folgende Exception geworfen werden:

java.io.FileNotFoundException: test.png (Zugriff verweigert)
IOException.getMessage() = "Can't create an ImageOutputStream!"

Danach ist test.png nicht mehr vorhanden.

Der Vollständigkeit halber hier kurz der Code - die ImageIO.write Zeile wirft den Fehler. Aber halt nicht immer, nur hin und wieder... vielleicht hat ja jemand eine Idee.
Code:
 public void writeImage(BufferedImage image){
    String name = "test.png";
    File pngImg = new File(name);
    try
    {
      ImageIO.write(image, "png", pngImg);
    }
    catch(IOException e)
    {
      System.out.println("Konnte die Datei nicht erstellen:\n" + e.getMessage());
    }
    pngImg.deleteOnExit();
  }

Bei Bedarf kann ich auch die komplette Exception aus der Konsole abtippen.
Danke im Voraus!

PS: "Zugriff verweigert" klingt zwar danach, aber ich habe natürlich die nötigen Rechte, dort Files zu speichern - sonst würde es ja auch immer meckern und nicht nur manchmal.
 

Wurstkopp

Bekanntes Mitglied
Mal ganz davon abgesehen, dass ich nicht den Sinn verstehe eine Bilddatei jede Sekunde zu überschreiben:

1. Stellt dein Aufrufender Code sicher, dass die Schreibeoperation fertig ist, bevor du eine neue startest? Wenn die Platte wegen anderen Sachen ausgelastet ist, könnte das ja mal länger als deine Sekunde dauern.
2. Wieso erstellst du jedes mal wieder die gleiche File Instanz, welche du dann auch noch jedes mal mit "deleteOnExit" markierst? Geht das nicht statisch?
 

Voldemort92

Mitglied
1. also aktuell habe ich sinngemäß
Code:
writeImage(img);
wait(1);
writeImage(img2);
Sollte das nicht automatisch sicherstellen, dass das erste writeImage fertig ist? Ansonsten könnte es tatsächlich daran liegen (und ich sollte mir Threads in Java noch mal ansehen).

2. Stimmt, das geht.
 

mrBrown

Super-Moderator
Mitarbeiter
Sollte das nicht automatisch sicherstellen, dass das erste writeImage fertig ist? Ansonsten könnte es tatsächlich daran liegen (und ich sollte mir Threads in Java noch mal ansehen).
Der gezeigte Code ja, aber bei was "sinngemäßem" kann das völlig anders aussehen ;)

2. Wieso erstellst du jedes mal wieder die gleiche File Instanz, welche du dann auch noch jedes mal mit "deleteOnExit" markierst? Geht das nicht statisch?
Was meinst du mit statisch? ;) static ist meistens nicht die sinnvollste Lösung, in diesem beschränkten Fall haben beide Varianten keinen großen Vorteil, aber dafür ist das auch einfach zu klein...
 

Voldemort92

Mitglied
Okay, dann nicht nur sinngemäß :D

Code:
while()
{
    changeImage(image);
    writeImage(image);
    try
    {
        TimeUnit.SECONDS.sleep(1);
    }
    catch(InterruptedException e)
    {
        e.printStackTrace();
    }
}
 

Wurstkopp

Bekanntes Mitglied
@Voldemort92 Für wen änderst du das Bild? Greift ein fremdes Programm direkt auf diese Datei zu? Kann es sein, dass dieses den Zugriff ggf. sperrt?

Was meinst du mit statisch? ;) static ist meistens nicht die sinnvollste Lösung, in diesem beschränkten Fall haben beide Varianten keinen großen Vorteil, aber dafür ist das auch einfach zu klein...

Erscheint mir besser als ständig die gleiche Instanz aufzubauen und direkt wieder vom GC entsorgen zu lassen. Auch wenn ich gerade noch mal nachgeschaut hab und "deleteOnExit" selber dafür sorgt keine doppelten Pfade entgegen zu nehmen. Da File aber auch Immutable ist, bietet es sich doch für ein "static final" an.
 

Voldemort92

Mitglied
Die png Datei wird vom Programm erstellt und nach Beendigung gelöscht, zwischendurch passiert mit ihr auch nichts außerhalb des Programms.

Vereinfacht gesagt habe ich ein Ausgangsbild, was ich iterativ mutiere, bis es bestimmte Eigenschaften besitzt. Viel mehr passiert da eigentlich auch nicht.
Mir ist inzwischen nur aufgefallen, dass das Problem nicht oder zumindest viel seltener auftritt, wenn ich den Ordner nicht offen hab, in dem das Bild gespeichert wird. Ich wollte mir einfach anschauen wie es sich langsam verändert.. jetzt hab ich den Ordner mal geschlossen und es gab jetzt seit 8000 Iterationen keinen Fehler, kann es da nen Zusammenhang geben?
 

Wurstkopp

Bekanntes Mitglied
Windows erstellt in bestimmten Ordner-Ansichten Thumbnails von Bildern (z.B. thumbs.db), damit du diese direkt im Explorer sehen kannst. Könnte ich mir zumindest als Erklärung vorstellen.
 

mrBrown

Super-Moderator
Mitarbeiter
Erscheint mir besser als ständig die gleiche Instanz aufzubauen und direkt wieder vom GC entsorgen zu lassen.
Lokale Variablen kann die JVM völlig wegoptimierten und Objekte erstellen und direkt wegschmeißen kann für den GC durchaus besser sein, als sie lange zu behalten. Rein aus Laufzeitoptimierungsgründen würde ich sowas nicht ohne sehr viel Profiling und Benchmarking machen ;)

Da File aber auch Immutable ist, bietet es sich doch für ein "static final" an.
Das ganze als Konstante anlegen, einfach weil sich eine konstante anbietet, ist da schon sinnvoller - die Frage ist dann nur, ob es bei einer Datei bleibt, oder ob nicht sehr bald eh schon mehrere kommen, bspw. alle 1000 Iterationen das Bild speichern.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Datentypen ArrayUtils.indexOf( ... ) liefert -1 obwohl Wert scheinbar enthalten ist Allgemeine Java-Themen 15
O Socket Object wird scheinbar falsch empfangen Allgemeine Java-Themen 6
I File wird in jar scheinbar nicht gefunden Allgemeine Java-Themen 6
PCOmega137 Objekten zufällig erzeugte Namen geben Allgemeine Java-Themen 2
B Zufällig zwischen vorgegebenen Zahlen auswählen Allgemeine Java-Themen 6
L Methoden Spieler zufällig einem Team zuweisen Allgemeine Java-Themen 6
Eldorado Berechnung von Koordinaten, die zufällig aussehen Allgemeine Java-Themen 5
neonfly Pokersoftware: Karten 'mischen' zufällig? Allgemeine Java-Themen 5
S Wie "zufällig" ist Collections.shuffle(.) Allgemeine Java-Themen 1
G Hashset einen eintrag zufällig entfernen Allgemeine Java-Themen 4
G Char-zufällig-generieren Allgemeine Java-Themen 11
Oneixee5 Oracle, wieder mal ... Allgemeine Java-Themen 12
E Objekte in einen String packen und wieder laden Allgemeine Java-Themen 5
LimDul Kam eine java.net.URL zu einer HashMap und ging als DNS Anfrage wieder heraus Allgemeine Java-Themen 18
W Vererbung Generics - mal wieder die verhaßte Rückwärtskompatibilität Allgemeine Java-Themen 2
J Variablen Mehrere int-variablen in txt abspeichern und danach wieder auslesen Allgemeine Java-Themen 1
X NetBeans Bilder und andere Dateien ins .jar schreiben und wieder aus .jar lesen Allgemeine Java-Themen 6
2 String Array in Datei schreiben und wieder davon lesen Allgemeine Java-Themen 2
F JLabel nach 5 Sekunden wieder leeren Allgemeine Java-Themen 7
Thallius Dateien Zippen und wieder heraus lesen? Allgemeine Java-Themen 4
S Zahlen aus (String mit zahlen) immer wieder neu auslesen Allgemeine Java-Themen 5
OnDemand Input/Output Variablen in Datei Speichern um sie wieder auszulesen Allgemeine Java-Themen 4
iB0T "goto" Befehl aus Batch in Java und Variablen wert immer wieder neu setzen Allgemeine Java-Themen 4
M Regex... mal wieder Allgemeine Java-Themen 3
M CapsLock abfragen wenn Fenster wieder aktiviert wird Allgemeine Java-Themen 5
B Mal wieder "Could not find the main class" Allgemeine Java-Themen 3
C Datentypen int in bytes zerlegen und wieder zusammen setzen Allgemeine Java-Themen 13
S Strings gehen "kaputt" wenn ich in CVS ein und wieder auschecke. Allgemeine Java-Themen 2
F Wieder mal die eBay API Allgemeine Java-Themen 3
E Speicherverwaltung bzw. Speicher wieder frei geben?! Allgemeine Java-Themen 8
T JConsole: Klassen werden geladen aber nicht wieder entladen Allgemeine Java-Themen 3
S Thread vorübergehend stilllegen und wieder aufwecken Allgemeine Java-Themen 18
data89 A-Stern: fährt immer wieder vor die Wand! - Hilfeeee Allgemeine Java-Themen 7
L Thread kurz unterbrechen und wieder starten Allgemeine Java-Themen 5
L Applet immer wieder neu laden - Problem Allgemeine Java-Themen 25
T RegEx, wieder einmal ... :-( Allgemeine Java-Themen 19
S Wieso stehen in der API immer wieder abstrakte Methoden ? Allgemeine Java-Themen 7
C Aus XML ein DOM Objekt und wieder zurück Allgemeine Java-Themen 2
M wieder mal applet probleme Allgemeine Java-Themen 17
A HTML-Seite wieder schließen Allgemeine Java-Themen 2
W Wieder einmal: PNG ausdrucken Allgemeine Java-Themen 3
S GUI komplett schließen und wieder Neu laden? Allgemeine Java-Themen 4
C Bild in .txt speichern und wieder als Bild speichern Allgemeine Java-Themen 2
Y Mal wieder vergleichen von Strings.[Leider noch ein Problem] Allgemeine Java-Themen 18
A String in umgekehrter reihenfolgen wieder geben Allgemeine Java-Themen 16
GilbertGrape mal wieder ne Regex-Frage Allgemeine Java-Themen 2
A Javakonsolenfenster geht gleich wieder zu Allgemeine Java-Themen 6
G Schon wieder Regex Problem :-/ Allgemeine Java-Themen 6
M Variablen Speicher wieder freigeben ? Allgemeine Java-Themen 9
L Werte in externer Datei speichern und wieder auslesen? Allgemeine Java-Themen 8
M Programm schließen und wieder neu starten Allgemeine Java-Themen 9
E Wieder mal der Classloader Allgemeine Java-Themen 6
J Nicht schießen - schon wieder OpenOffice. Allgemeine Java-Themen 4
R Immer wieder NullPointerException Allgemeine Java-Themen 2
L JVM: Speicher wieder für OS freigeben? Allgemeine Java-Themen 5
I Aus Exception wieder zurück Allgemeine Java-Themen 5
J Thread beenden und wieder starten? Allgemeine Java-Themen 20
M Array in eine Datei Schreiben und wieder auslesen Allgemeine Java-Themen 10
S Job immer wieder ausführen Allgemeine Java-Themen 4
N Mal wieder char-encoding Probleme Allgemeine Java-Themen 5
P Filechooser öffnet sich immer wieder neu Allgemeine Java-Themen 4
L Speicherplatz eies RIESEN objektes direkt wieder freigeben Allgemeine Java-Themen 5
V Irgendwie benutzt er wieder Java 1.4 Allgemeine Java-Themen 7
G Array/String aus Request wieder in Array konvertieren Allgemeine Java-Themen 2
A gemaltes wieder löschen Allgemeine Java-Themen 24
U Mal wieder DoubleBuffering Allgemeine Java-Themen 20
A Thema JAR-Erstellung (mal wieder) => etwas komplizierter Allgemeine Java-Themen 8
L schon wieder der "javac nicht gefunden" fehler Allgemeine Java-Themen 9
T Objekte eindeutig zerlegen und wieder zusammen bauen? Allgemeine Java-Themen 6
B mal wieder jar! Allgemeine Java-Themen 53
M schon wieder Comport-Problem Allgemeine Java-Themen 21
S JPanel zur Laufzeit verbergen bzw. wieder anzeigen lassen Allgemeine Java-Themen 4
C Über C/C++ (JNI) angeforderten Speicher wieder frei geben Allgemeine Java-Themen 3
M statische regex und vergleiche oder immer wieder compilen Allgemeine Java-Themen 2
R Aus InputStream wieder eine Datei erzeugen? Allgemeine Java-Themen 2
U schon wieder regex Allgemeine Java-Themen 3
M Mal wieder . Regular Expressions Allgemeine Java-Themen 2
J Mal wieder jars Allgemeine Java-Themen 2
T CMD nach aufruf von javaw Programmname wieder schließen Allgemeine Java-Themen 3
J String mit GZIPInputStream in Datei schreiben und wieder les Allgemeine Java-Themen 2
J User Klasse in den Vector, Object Klasse wieder raus... Allgemeine Java-Themen 4
D Bilder einlesen, bearbeiten und wieder in Datei schreiben Allgemeine Java-Themen 3
G Adressen in Datei speichern und wieder auslesen Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben