2012-11-08 8 views
7

Ich habe diese FrageErstellen Sie eine Kopie eines Input von einem HttpURLConnection so kann es zweimal

How do I convert an InputStream to a String in Java?

zu konvertieren einen Inputstream in einen String mit diesem Code verwendet werden:

public static String convertStreamToString(java.io.InputStream is) { 
    java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A"); 
    return s.hasNext() ? s.next() : ""; 
} 

Meine inputstream kommt von einem HttpURLConnection InputStream, und wenn ich meine Umwandlung in String mache, ändert sich der Inputstream und ich kann ihn nicht mehr verwenden. Das ist der Fehler, die ich bekomme:

Premature end of file.' SOAP 

Was kann ich tun, um meine Eingabestrom zu halten, wenn ich es auf String mit den richtigen Informationen umwandeln ?.

Speciffically ist dies die Informationen, die Änderungen:

inCache = true (before false) 
keepAliveConnections = 4 (before 5) 
keepingAlive = false (before true) 
poster = null (before it was PosterOutputStream object with values) 

Danke.

+0

Eduardo: ist es möglich, dass Sie einen anderen Input zu erstellen und für den zweiten Client benutzen? Nach dem Lesen von Daten in dieser Methode (convertStreamToString) können Sie diese Daten in einen anderen Stream (z. B. ByteArrayInputStream) zurückversetzen und dann an Ihren zweiten Client senden, der die gleichen Daten aus dem Eingabestream lesen muss. – mhshams

+0

Hallo Mohammad, ich denke ich verstehe nicht ganz, was du meinst. Können Sie bitte auf die Frage antworten, die mehr Details gibt ?. Ich werde mehr als glücklich sein, Ihnen mein Kopfgeld zu geben, wenn es gut geht. Ja, Sie haben Recht in Ihrem Kommentar für die andere Frage, ich muss meinen InputStream intakt halten, um ihn dann richtig in eine SOAP-Nachricht zu konvertieren. Vielen Dank!. – Eduardo

Antwort

10

Wenn Sie Ihren Eingabestream an den Scanner übergeben oder seine Daten auf andere Weise lesen. Sie verbrauchen tatsächlich seine Daten und es wird keine Daten mehr in diesem Stream geben.

müssen Sie möglicherweise einen neuen Eingabestream mit denselben Daten erstellen und ihn anstelle des ursprünglichen Datenstroms verwenden. Beispiel:

ByteArrayOutputStream into = new ByteArrayOutputStream(); 
byte[] buf = new byte[4096]; 

// inputStream is your original stream. 
for (int n; 0 < (n = inputStream.read(buf));) { 
    into.write(buf, 0, n); 
} 
into.close(); 

byte[] data = into.toByteArray(); 

//This is your data in string format. 
String stringData = new String(data, "UTF-8"); // Or whatever encoding 

//This is the new stream that you can pass it to other code and use its data.  
ByteArrayInputStream newStream = new ByteArrayInputStream(data); 
+1

Ich sehe, dass Sie 4096 setzen, es hat gut funktioniert. Wie kann ich jedoch die Größe des Eingabestreams ermitteln? Vielen Dank!. – Eduardo

+2

Diese Zahl (4096) ist nur die Puffergröße. Sie können eine beliebige andere Nummer wählen.Sie können die Eingabestromgröße nicht finden, ohne sie zu lesen. Sie können InputStream.available() verwenden, aber es wird die aktuelle Anzahl der Bytes zurückgegeben, die im Stream verfügbar sind. Tatsächlich kann sich die Streamgröße während der Zeit ändern, in der Sie sie lesen. Die einzige garantierte Lösung sind die gelesenen Daten bis zum Ende des Streams. – mhshams

2

Der Scanner liest bis zum Ende des Stroms und schließt ihn. Also wird es nicht weiter verfügbar sein. Verwenden Sie PushbackInputStream als Wrapper für Ihren Eingabestream und verwenden Sie die Methode unread().

+0

Hallo Antony, ich glaube, dass du recht hast. Wie verwende ich jedoch die ungelesene() Methode, die Sie erwähnen ?. Danke vielmals!!!. – Eduardo

+1

@Antony mit PushbackInputStream können Sie nicht lesen Sie die Daten im ursprünglichen InputStream. Ich denke, dass Eduardo den ursprünglichen InputStream (den von der URL-Verbindung) intakt halten muss. – mhshams

0

Versuchen Sie, Apache Utilities zu verwenden. In meinem voreingestellten Projekt, ich habe die gleiche Sache

Input xml = connection.getInputStream() durchgeführt;

Zeichenfolge responseData = IOUtils.toString (xml);

Sie können IOUtils von Apache erhalten [import org.apache.commons.io.IOUtils]

+0

Hi, eigentlich ist das in der Frage kommentiert und ich habe es ausprobiert. Allerdings verbrauchte ich auch meinen Inputstream und am Ende war er unbrauchbar. Vielen Dank!. – Eduardo

+0

Sie können die Zeichenfolgedaten so oft verwenden, wie Sie möchten. Da stream kann nicht rückwärts gelesen werden und Sie werden viele Probleme auf der ganzen Linie für solche Unterstützung konfrontiert werden – Reddy

+0

Ja kann ich die Zeichenfolge so oft wie ich will, aber aber ich brauchte den Eingangsstrom zweimal, einmal in String (um die richtige SOAP-Version zu kennen, die ich verwenden sollte) und das zweite Mal, um den Eingangsstrom in eine SOAP-Nachricht zu konvertieren. – Eduardo

Verwandte Themen