Inputstream in file schreiben?

beta20

Top Contributor
Hallo,

ich hänge gerade beim Reinschreiben eines Inputstream ins eine Datei.

Ich lasse mir einen InputStream genieren:

-> Ich geniere mir einen InputStream (PDF, welches später per Email in meinen Anhang versendet werden soll)
Java:
InputStream is = pdfDocumentGenerationService.createPdfWithAttachments(offer.getDocumentDesigner(),fileName, false);

Diesen Inputstream möchte ich nun wiederum physikalisch in eine Datei bei mir auf dem Rechner schreiben:

Hier verwende ich dann:
Java:
File destFile = new File("mypath.pdf");
FileUtils.copyInputStreamToFile(inputStream, destFile);

Prinzipiell wird das File erzeugt, aber die PDF hat 0kb, also sprich es fehlt der Content.

Was mache ich falsch?

Danke für jede Hilfe
 
B

BestGoalkeeper

Gast
Nochmal der Hint, dass du in einen InputStream nur schreiben kannst. ;)

Ungeachtet dessen, muss der Stream natürlich auch geschlossen werden...
 

temi

Top Contributor
Nochmal der Hint, dass du in einen InputStream nur schreiben kannst. ;)

Ungeachtet dessen, muss der Stream natürlich auch geschlossen werden...
Ich nehme an, es handelt sich um ApacheCommons FileUtils?
public static void copyInputStreamToFile(InputStream source, File destination)

Copies bytes from an InputStream source to a file destination. The directories up to destination will be created if they don't already exist. destination will be overwritten if it already exists. The source stream is closed.
 

mrBrown

Super-Moderator
Mitarbeiter
Nochmal der Hint, dass du in einen InputStream nur schreiben kannst. ;)
Andersrum. Aus einem InputStream kann man lesen, in einen OutputStream schreiben.

Ungeachtet dessen, muss der Stream natürlich auch geschlossen werden...
Das macht FileUtils.copyInputStreamToFile.


-> Ich geniere mir einen InputStream (PDF, welches später per Email in meinen Anhang versendet werden soll)
Enthält der InputStream denn wirklich auch Daten?
 
B

BestGoalkeeper

Gast
Die zwei Snippets sehen auf den ersten Blick korrekt aus.

Kann mir aber nicht herleiten, wofür "false" steht...
 

beta20

Top Contributor
Java:
pdfDocumentGenerationService.createPdfWithAttachments(offer.getDocumentDesigner(),fileName, false)

Dieser Code generiert mir ein Inputstream aus einer vorhandenen Webseite (siehe auch in einem anderen Beitrag von mir hier).
Das funktioniert auch und ich übergebe den Inputstream einem anderen Objekt, welcher dann mir eine Email versendet.
Im Anhang der Email befindet sich dann die PDF, daher würde ich sagen, dass das passt und der Stream auch Daten enthält....

Ich bin nun verwirrt...
Das heißt ich muss den InputStream in einen Outputstream wandeln und dann in die Datei (File) schreiben?
 

mrBrown

Super-Moderator
Mitarbeiter
Das heißt ich muss den InputStream in einen Outputstream wandeln und dann in die Datei (File) schreiben?
Nein.

Dieser Code generiert mir ein Inputstream aus einer vorhandenen Webseite (siehe auch in einem anderen Beitrag von mir hier).
Das funktioniert auch und ich übergebe den Inputstream einem anderen Objekt, welcher dann mir eine Email versendet.
Im Anhang der Email befindet sich dann die PDF, daher würde ich sagen, dass das passt und der Stream auch Daten enthält....
Im anderem Forums-Thread hast du mehrere Threads genutzt, zb mit ExecutorService genutzt, hast du sichergestellt dass das keine Probleme verursacht?

Ansonsten UnitTests für die einzelnen Teile schreiben, damit kann man den Fehler sicher eingrenzen.

Möglich wäre auch mit TeeInputStream und ByteArrayOutputStream zu loggen, was geschrieben wird.
 

beta20

Top Contributor
Ich habe es mal im Debug Modus ausgeführt.

Es scheint, dass während dem Senden bzw. dem Anhang hinzufügen der Fehler auftritt, sodass die PDF nicht richtig generiert wird.

Dieser Code wird beim Senden ausgeführt, sodass der Anhang erstellt wird.

Java:
    private Multipart addAttachments(Multipart multipart, EmailHelperClass email)
            throws MessagingException, IOException {
....
        if (attachments != null && attachments.size() > 0) {
            for (EmailAttachment attachment : attachments) {
       ...
                if (attachment.getInputStream() != null) {
                    byte[] bytes = IOUtils.toByteArray(attachment.getInputStream());
                    source = new ByteArrayDataSource(bytes, attachment.getMimeType());
                } 
            }
        }

        return multipart;
    }

Das Problem ist hier:
byte[] bytes = IOUtils.toByteArray(attachment.getInputStream());
source = new ByteArrayDataSource(bytes, attachment.getMimeType());



Nun meine Frage:
a) was passiert in dem Code, dass das PDF nicht richtig generiert wird?
b) Wie muss mein Code angepasst werden (ohne unbedingt eine Änderung in Multipart addAttachments vornehmen zu müssen?
 
Zuletzt bearbeitet:

beta20

Top Contributor
1)
InputStream is = pdfDocumentGenerationService.createPdfWithAttachments(offer.getDocumentDesigner(),
fileName, false);
-> Hier verwende ich ExecutorService

2) Code in post #12
-> Sprich der Inputstream wird in ein Objekt (EmailAttachment) hingeschrieben und dann wird die Email versendet (inkl. Anhang, also der Inputstream)

3) Erstellung des Files (Physikalisch)
File destFile = new File("mypath.pdf");
FileUtils.copyInputStreamToFile(inputStream, destFile);

Wie kann ich das denn lösen?
Kann ich nochmals eine Kopie von InputStream is machen, welchen ich dann in 3) verwende?

Ich bekomme auch keinen Compiler Fehler, das File ist einfach nicht korrekt gefüllt.
 

mrBrown

Super-Moderator
Mitarbeiter
Wie kann ich das denn lösen?
Kann ich nochmals eine Kopie von InputStream is machen, welchen ich dann in 3) verwende?
Ja, oder aber mal das ganze Design überdenken. InputStreams scheinen nicht die sinnvollste Wahl zu sein, wenn du mehrmals daraus lesen musst.

Ich bekomme auch keinen Compiler Fehler, das File ist einfach nicht korrekt gefüllt.
Einen Laufzeit-Fehler würdest du bekommen, wenn du Streams korrekt schließt.
 
K

kneitzel

Gast
Also ich sehe zwei Möglichkeiten:
a) Schreib die Daten erst in die Datei - dann kannst Du die Datei wieder lesen.

b) Oder speichere die Daten zwischen um diese dann von dem Zwischenspeicher aus zu nutzen.

b dürfte einfacher sein, denn Du liest ja alles schon in ein byte Array. Also Du kannst das byte Array ja erneut nutzen für einen Stream:
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
und dann diesen InputStream nutzen für das schreiben in die Datei.

A hat den Vorteil, dass Du es nicht im Speicher halten musst aber dafür hast du mehr IO zur Platte (Da dort aber auch ein Cache aktiv sein sollte, sollte das ggf. auch nicht ins Gewicht fallen). B hast Du aber schon fast fertig ...
 

temi

Top Contributor
Vielleicht kann man was mit Stream#mark() und Stream#reset() machen? Das ist aber einfach wild ins Blaue geraten und würde mir auch nicht sehr sauber vorkommen.
 

beta20

Top Contributor
Wie kann ich diese Zeile umschreiben, dass der InputStream nicht geschlossen wird (was die Funktion wohl macht):
FileUtils.copyInputStreamToFile(inputStream, destFile);
 

beta20

Top Contributor
Also ich sehe zwei Möglichkeiten:
a) Schreib die Daten erst in die Datei - dann kannst Du die Datei wieder lesen.

b) Oder speichere die Daten zwischen um diese dann von dem Zwischenspeicher aus zu nutzen.

b dürfte einfacher sein, denn Du liest ja alles schon in ein byte Array. Also Du kannst das byte Array ja erneut nutzen für einen Stream:
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
und dann diesen InputStream nutzen für das schreiben in die Datei.

A hat den Vorteil, dass Du es nicht im Speicher halten musst aber dafür hast du mehr IO zur Platte (Da dort aber auch ein Cache aktiv sein sollte, sollte das ggf. auch nicht ins Gewicht fallen). B hast Du aber schon fast fertig ...


Tendiere eher zu a)

Wie kann ich diese Zeile umschreiben, dass der InputStream nicht geschlossen wird (was die Funktion wohl macht):
FileUtils.copyInputStreamToFile(inputStream, destFile);

b) Hier schreibe ich zwar einen ByteArrayInputStream, aber diese Funktion hat mit den oberen keine direkte Verbindung.... addAttachments() wird irgendwann aufgerufen in 2) in der die Email erstellt wird
 

mrBrown

Super-Moderator
Mitarbeiter
BTW: ich würde dir wirklich Raten, dir erst die nötigen Grundlagen anzueignen, bevor du dich an das schreiben solch großer Applikation machst, wie du es anscheinend tust. Das, was du aktuell machst, hat nur einen Haufen Bugs und Sicherheitslücken zur Folge...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Hilfe bei InputStream To File Java Basics - Anfänger-Themen 22
B Input/Output Data / Buffer / File Outstream Inputstream Java Basics - Anfänger-Themen 2
K Warum wird hier nur etwas in eine txt Datei geschrieben und nicht in alle drei (InputStream/OutputStream/Reader/Writer) Java Basics - Anfänger-Themen 1
I Dateigröße von einem InputStream oder byte[] bekommen Java Basics - Anfänger-Themen 2
berserkerdq2 inputstream und bufferedwirter /outputstream und bufferedwriter Java Basics - Anfänger-Themen 9
T Bluetooth, Inputstream Java Basics - Anfänger-Themen 0
I InputStream beim zweiten Mal fehlerhaft Java Basics - Anfänger-Themen 10
B InputStream / OutputStream / PipedOutputStream und managedExecutorService Java Basics - Anfänger-Themen 3
B java.io.OutputStream zu java.io.InputStream konvertieren Java Basics - Anfänger-Themen 18
B InputStream (PDF) nach Image (PNG / JPG) konvertieren? Java Basics - Anfänger-Themen 2
B Konvertieren: Outputstream zu Inputstream Java Basics - Anfänger-Themen 13
J Was genau macht die Methode close() im InputStream? Java Basics - Anfänger-Themen 5
E InputStream im Servlet wirft Exception Java Basics - Anfänger-Themen 5
D InputStream parsen und als Bilddatei abspeichern Java Basics - Anfänger-Themen 1
G Input/Output InputStream gibt nicht die Korrekten Werte aus Java Basics - Anfänger-Themen 10
T Datentypen InputStream to list of Int (or similar) Java Basics - Anfänger-Themen 4
P bytes aus einem InputStream zählen Java Basics - Anfänger-Themen 2
P InputStream eines Musik-Streams abspielen Java Basics - Anfänger-Themen 2
I Resize Image - Einlesen von InputStream Java Basics - Anfänger-Themen 3
T Input/Output Exception bei einem InputStream Java Basics - Anfänger-Themen 2
W ProcessBuilder InputStream in Array speichern Java Basics - Anfänger-Themen 3
K InputStream erstellen Java Basics - Anfänger-Themen 4
L Webservice soll InputStream übergeben bekommen Java Basics - Anfänger-Themen 7
S Eigener InputStream, Hilfe bei read-Methode Java Basics - Anfänger-Themen 6
C InputStream Java Basics - Anfänger-Themen 2
O Input/Output Fragen zum InputStream Java Basics - Anfänger-Themen 7
E Input/Output Relativer Bild-Pfad für InputStream Java Basics - Anfänger-Themen 5
G Frage zu InputStream? Java Basics - Anfänger-Themen 11
E Socket InputStream "terminiert" nicht Java Basics - Anfänger-Themen 4
E Input/Output Inputstream während der Laufzeit füllen Java Basics - Anfänger-Themen 2
A Frage zu Beispiel eines Dekorierers von InputStream Java Basics - Anfänger-Themen 4
B Input/Output InputStream (JSch) in OutputStream (Blob) überführen Java Basics - Anfänger-Themen 8
P Input/Output InputStream Listener? Java Basics - Anfänger-Themen 7
M Eigener InputStream will nicht mit BufferedReader Java Basics - Anfänger-Themen 3
S Input/Output Neuen InputStream System.in setzen Java Basics - Anfänger-Themen 11
A InputStream gibt nur jede 2te Zeile aus Java Basics - Anfänger-Themen 7
J InputStream FTP Java Basics - Anfänger-Themen 8
brunothg Inputstream zu Filechannel Java Basics - Anfänger-Themen 6
K StringWriter/String nach InputStream konvertieren Java Basics - Anfänger-Themen 3
Benji0815 Inputstream aus Konsole in JTextArea Java Basics - Anfänger-Themen 14
A Problem mit InputStream Java Basics - Anfänger-Themen 4
bastiann Kann man Inputstream nur auf ein Zeichen anwenden? Java Basics - Anfänger-Themen 5
U Inputstream.read()/readLine() blockiert immer Java Basics - Anfänger-Themen 18
S Problem mit url, inputStream und bytes beim Quellcode laden. Java Basics - Anfänger-Themen 6
G Kompletten InputStream der Kommandokonsole ausgeben Java Basics - Anfänger-Themen 8
G InputStream aufrufen, ändern und zurück geben Java Basics - Anfänger-Themen 2
W Zeichen ersetzen im InputStream Java Basics - Anfänger-Themen 3
N String vom InputStream in TextArea übertragen Java Basics - Anfänger-Themen 6
A Frage zu Puffergröße bei InputStream Java Basics - Anfänger-Themen 9
G in einem inputstream auf " " abfragen? Java Basics - Anfänger-Themen 3
M Datei speichern mittels InputStream Java Basics - Anfänger-Themen 13
P InputStream in Byte-Array speichern Java Basics - Anfänger-Themen 2
G String in InputStream umwandeln? Java Basics - Anfänger-Themen 8
M Auslesen eines InputStream Java Basics - Anfänger-Themen 4
M Problem mit InputStream Java Basics - Anfänger-Themen 7
S Probleme mit InputStream- Rückgabe Java Basics - Anfänger-Themen 4
I InputStream von Konsole abfangen Java Basics - Anfänger-Themen 6
G InputStream im finally-Block schließen Java Basics - Anfänger-Themen 7
K InputStream? Java Basics - Anfänger-Themen 3
S Sockets and InputStream Java Basics - Anfänger-Themen 2
M InputStream einer Socketverbindung funktioniert nicht Java Basics - Anfänger-Themen 19
M Byte InputStream zu Zeichenformat Unicode bzw String konvert Java Basics - Anfänger-Themen 5
R InputStream erstellen, der aus String liest Java Basics - Anfänger-Themen 8
R ENTER in InputStream nicht lesen Java Basics - Anfänger-Themen 4
G InputStream auslesen und zurückschreiben Java Basics - Anfänger-Themen 9
R BufferedReader <-> InputStream Java Basics - Anfänger-Themen 3
R Suche geeignetes InputStream Java Basics - Anfänger-Themen 2
D InputStream -> Image Java Basics - Anfänger-Themen 6
M String zu InputStream/InputSource Java Basics - Anfänger-Themen 2
S Problem mit InputStream / flush() / BufferedReader Java Basics - Anfänger-Themen 19
C Aus ein Image-Objekt einen InputStream generieren? Java Basics - Anfänger-Themen 6
J InputStream in String umwandeln Java Basics - Anfänger-Themen 5
J InputStream ist null Java Basics - Anfänger-Themen 7
P InputStream, BufferedString Java Basics - Anfänger-Themen 3
Timo12345 JNLP File mit Java öffnen Java Basics - Anfänger-Themen 2
I Bild richtig speichern / Hochkant im File Explorer, nach Upload vertikal Java Basics - Anfänger-Themen 9
R File.pathSeparator und File.separator Java Basics - Anfänger-Themen 46
KeinJavaFreak Erste Schritte Java "Executable Jar File" nicht vorhanden Java Basics - Anfänger-Themen 1
izoards Prunsrv - Windows Service - .bat file starten Java Basics - Anfänger-Themen 84
I File Uploader... Statusanzeige, Berechnung des Status etc. Java Basics - Anfänger-Themen 0
I H2 Datenbank starten / Daten in File speichern Java Basics - Anfänger-Themen 25
G jar file lässt sich nicht öffnen Java Basics - Anfänger-Themen 1
N Textdatei aus Resourcen-Ordner eines Projekts/ jar-file lesen Java Basics - Anfänger-Themen 4
J File length als Prüfwert für Download Java Basics - Anfänger-Themen 5
berserkerdq2 Überprüfen ob eine Schreibberechtigung auf ein file exisitert bzw. ob man dieses file löschen kann, wie? Java Basics - Anfänger-Themen 9
berserkerdq2 IOstreams, was unterscheidet file von z. B. BufferedWriter? Java Basics - Anfänger-Themen 11
J Datentypen String in File konvertieren funktioniert nicht Java Basics - Anfänger-Themen 4
A java jar-File Java Basics - Anfänger-Themen 1
E Executable jar file fehler Java Basics - Anfänger-Themen 9
I Upload File zu einem Webservice Java Basics - Anfänger-Themen 17
I ZIP File erstellen Java Basics - Anfänger-Themen 10
LeoDerKek Textdatei in JAR-File Java Basics - Anfänger-Themen 4
Tom/S File Java Basics - Anfänger-Themen 10
AleXusher Mehrdimensionales Array aus txt.file auslesen Java Basics - Anfänger-Themen 4
A Checkstyle - File contains tab characters Java Basics - Anfänger-Themen 2
H Java file nicht gefunden Java Basics - Anfänger-Themen 5
C File speichern Java Basics - Anfänger-Themen 5
C Runnable Jar-File erzeugen Java Basics - Anfänger-Themen 14
C Pfad zu Properties-File bei ResourceBundle Java Basics - Anfänger-Themen 7
F GSON file mit einer List erstellen Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben