javax.imageio.ImageIO Problem erstellen ImageInputStream
Ich habe ein Servlet in Tomcat 5.5, liest, lokale Bilder, sitzend auf einem Ordner. Das Bild wird dann zurück an ein Applet.
Ich bin immer diese "javax.imageio.IIOException: Kann nicht erstellen Sie ein ImageInputStream!", Fehler und nicht sicher, was es verursacht.
Hat jemand hatte dieses problem vor? Könnte dies ein Thread-Problem in der ImageIO? Ich kann nicht reproduzieren Sie das Problem, da es tritt etwa 3-mal für jeweils 1000 Anfragen.
EDIT: Das ist der Servlet-code, der liest die Bild. Ich habe gerade mit der ImageIO.Lesen(Datei) in Ihrer statischen form innerhalb des Servlet die doPost-Methode die gleiche Weise unten:
doPost(req,resp){
...
BufferedImage image = ImageIO.read(imageFile);
...
}
Hier ist der Quellcode für javax.imageio.ImageIO.Lesen(Datei):
public static BufferedImage read(File input) throws IOException {
if (input == null) {
throw new IllegalArgumentException("input == null!");
}
if (!input.canRead()) {
throw new IIOException("Can't read input file!");
}
ImageInputStream stream = createImageInputStream(input);
if (stream == null) {
throw new IIOException("Can't create an ImageInputStream!");
}
BufferedImage bi = read(stream);
if (bi == null) {
stream.close();
}
return bi;
}
- Wo ist der code createImageInputStream? Ist es die statische Methode in ImageInputStream, statisch importiert, oder ist es etwas anderes?
- Ich nenne das ImageIO.Lesen(Datei) aus der Servlet doPost().
- Nein, ich meine, du machst einen Anruf zu
createImageInputStream
aber es ist nicht klar, ob das statisch importiert Aufruf ImageInputStream.createImageInputStream oder etwas anderes. - das ist wahrscheinlich
ImageIO.createImageInputStream(...)
. - Oh createImageInputStream ist eine statische Methode. Es ist eigentlich ein Teil der ImageIO-Bibliothek. Die ImageIO ist eine Java-Bibliothek, die ich verwende.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Quelle, die ich habe (Java5, aber ich bezweifle, es hat sich viel verändert) besagt, dass, wenn es keine ImageInputStream service-Anbieter registriert, die
createImageInputStream
Methode gibt null zurück, und damit bekommen Sie eine Ausnahme.Aus der JavaDoc auf
IIORegistry.getDefaultInstance()
dieImageIO
:Damit könnte es tatsächlich ein threading-problem in, dass Sie eine Ebene neue Instanz von
IIORegistry
.Edit: Graben tiefer in die Quelle habe ich Folgendes gefunden:
Meisten wahrscheinlich, dass Sie bekommen würde, eine
FileImageInputStream
, da Sie eine Datei. Jedoch, wenn eine Ausnahme Auftritt, wird die service-Anbieter gibtnull
. So gibt es vielleicht einenFileNotFoundException
oder andereIOException
geworfen wird, die bewirkt, dass der Strom nicht erzeugt werden.Leider gibt es keine Protokollierung in den code, damit müsstest du die debug-irgendwie. Es ist wahrscheinlich aufgrund der fehlenden Datei Berechtigungen, die eine beschädigte/unvollständige Datei oder die Datei fehlt.
Hier ist der Java5-source für
FileImageInputStreamSpi#createInputStreamInstance()
Wenn die einzige funktionale Anforderung ist zu Lesen, Bilder von der lokalen Festplatte aus und senden es unverändert, um die HTTP-response mit einem servlet, dann tun Sie nicht müssen die
ImageIO
überhaupt. Es fügt nur unnötigen overhead und andere Probleme wie Sie jetzt haben.Loszuwerden, die
ImageIO
Zeug und nur Strom raw-Bild direkt von der Festplatte in den HTTP-Antwort, die entlang einem Satz von der richtigen Antwort Header. Zum Beispiel,Das ist alles. Sie müssen nur
ImageIO
Wann immer Sie möchten, Bearbeiten Sie das Bild im server-Speicher vor der Rückgabe, z.B. Größe verändern, transformieren oder so etwas.Einem anderen, robuster Beispiel ein servlet kann gefunden werden hier und einen fortschrittlicheren hier.
Wo ist die Verwendung von close () - Methoden innerhalb der Ausnahmebehandlung? Streams geschlossen werden, wenn Ausnahmen gibt es auch, sowie die normalen Beendigung des Blocks der code.
Das symptom klingt wie Sie laufen out-of-heap-space oder irgendwann.
Es ist nicht die Codierung Fehler, die andere wies darauf hin, da das problem sporadisch Auftritt.