Inputstream in file schreiben?

B

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

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

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...
 
B

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

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.
 
B

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:
B

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

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.
 
kneitzel

kneitzel

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 ...
 
temi

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.
 
B

beta20

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

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

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
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
rafi072001 Lesen aus einem Excel File Java Basics - Anfänger-Themen 10
C Bild in executable JAR File mitgeben Java Basics - Anfänger-Themen 5
K File (png) in Image laden Java Basics - Anfänger-Themen 3
S Input/Output Reader/Writer finden file nicht Java Basics - Anfänger-Themen 3
T Buffered Stream leert Txt File Java Basics - Anfänger-Themen 3
A 2d Arrays aus txt.file einlesen Java Basics - Anfänger-Themen 16
Dimax In Java File (nicht in Java Projekt) mysql Driver importieren Java Basics - Anfänger-Themen 3
K File wird in der .Jar nicht gefunden Java Basics - Anfänger-Themen 3
E TXT FILE EINLESEN Java Basics - Anfänger-Themen 4
Trèfle EXCEL-File Laufwerkunabhängig einbinden. Java Basics - Anfänger-Themen 1
B HTML File einlesen inkl. Bilder? Java Basics - Anfänger-Themen 2
topi relativer Pfad in einem Runnable JAR file Java Basics - Anfänger-Themen 12
A jar File kleiner bekommen Java Basics - Anfänger-Themen 3
B File öffnen in src/main/webapp Java Basics - Anfänger-Themen 4
K File-Name Vergleich Java Basics - Anfänger-Themen 2
krgewb Runnable JAR File Export Java Basics - Anfänger-Themen 11
S Maxium aus einer File finden Java Basics - Anfänger-Themen 12
dapzoo Class File Version zu niedrig? Ausführen über Eingabeaufforderung nicht möglich Java Basics - Anfänger-Themen 14
D Input/Output File exists canRead canWrite Java Basics - Anfänger-Themen 11
B cal4j - Error at line 1:Unexpected end of file Java Basics - Anfänger-Themen 0
P jar file lässt sich nicht ausführen Java Basics - Anfänger-Themen 4
E Best Practice Jar-file mit zwei Klassen und externer Bibliothek über Konsole erzeugen Java Basics - Anfänger-Themen 13
M Erste Schritte CSV-File einlesen und Daten verarbeiten Java Basics - Anfänger-Themen 5
F File von Windowsfreigabe laden Java Basics - Anfänger-Themen 1
S java.nio.file.FileSystemException bei Dateizugriff vermeiden Java Basics - Anfänger-Themen 7
Vince42 NIO File Tree in XML umwandeln Java Basics - Anfänger-Themen 10
J Zweidimensionales Array in CSV File exportieren Java Basics - Anfänger-Themen 3
E War-File Problem mit Eclipse Java Basics - Anfänger-Themen 3
B Excel File einlesen und Überschrift prüfen Java Basics - Anfänger-Themen 8
M Email versenden Outlook, attached File, ohne Anmeldung Java Basics - Anfänger-Themen 4
M Input/Output Word File Kopieren Java Basics - Anfänger-Themen 12

Ähnliche Java Themen

Anzeige

Neue Themen


Oben