2012-11-08 8 views
7

Kiedyś to pytanieUtwórz kopię InputStream z HttpURLConnection dzięki czemu może być stosowany dwa razy

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

przekonwertować InputStream do String z tym kodem:

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

My inputstream pochodzi z HttpURLConnection InputStream, a kiedy wykonuję konwersję do String, strumień wejściowy zmienia się i nie mogę go dłużej używać. Jest to błąd, który pojawia się:

Premature end of file.' SOAP 

Co mogę zrobić, aby moje InputStream, kiedy przekonwertować go na ciąg z odpowiednimi informacjami ?.

Speciffically jest to informacja, która zmienia:

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

Dziękuję.

+0

Eduardo: Czy to możliwe, aby utworzyć kolejną InputStream i użyć go do drugiego klienta? Po odczytaniu danych w tej metodzie (convertStreamToString) można umieścić te dane z powrotem w innym strumieniu (np. ByteArrayInputStream), a następnie wysłać je do drugiego klienta, który musi odczytać te same dane ze strumienia wejściowego. – mhshams

+0

Cześć Mohammad, myślę, że nie rozumiem w pełni tego, co masz na myśli. Czy możesz odpowiedzieć na pytanie, podając więcej szczegółów ?. Będę więcej niż szczęśliwy mogąc dać ci nagrodę, jeśli wszystko będzie dobrze. Tak, masz rację w swoim komentarzu do drugiego pytania, muszę zachować mój InputStream nienaruszony, aby przekonwertować go, a następnie poprawnie do wiadomości SOAP. Dziękuję Ci!. – Eduardo

Odpowiedz

10

Po przekazaniu strumienia wejściowego do skanera lub odczytaniu jego danych w jakikolwiek inny sposób. faktycznie zużywasz dane i nie będzie już dostępnych danych w tym strumieniu.

konieczne może być utworzenie nowego strumienia wejściowego z tymi samymi danymi i użycie go zamiast oryginalnego. na przykład:

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

Widzę, że postawiłeś 4096, wszystko działało dobrze. Jak jednak mogę uzyskać rozmiar strumienia wejściowego ?, nie widzę metody pobierania ". Dziękuję Ci!. – Eduardo

+2

ta liczba (4096) to tylko rozmiar bufora. możesz wybrać dowolną inną liczbę, która Ci się podoba.nie możesz znaleźć rozmiaru strumienia wejściowego bez jego czytania. możesz użyć InputStream.available(), ale zwróci ona bieżącą liczbę bajtów, które są dostępne w strumieniu. w rzeczywistości rozmiar strumienia może się zmieniać w czasie, kiedy go czytasz. więc jedynym gwarantowanym rozwiązaniem jest odczyt danych, dopóki nie dojdziesz do końca strumienia. – mhshams

2

Skaner odczytuje do końca strumienia i zamyka go. Więc nie będzie dostępny dalej. Użyj PushbackInputStream jako opakowania do strumienia wejściowego i użyj metody unread().

+0

Witam Antoniuszu, wierzę, że masz rację. Jednak jak używać wspomnianej metody unread()? Wielkie dzięki!!!. – Eduardo

+1

@Antony za pomocą metody PushbackInputStream NIE MOŻNA nieprzeczytać danych w oryginalnym pliku InputStream. Myślę, że Eduardo musi zachować oryginalny InputStream (ten z połączenia URL) w stanie nienaruszonym. – mhshams

0

Spróbuj użyć Apache Utilities. W moim zadanego projektu, zrobiłem to samo

InputStream xml = connection.getInputStream();

String responseData = IOUtils.toString (xml);

Można uzyskać IOUtils z Apache [org.apache.commons.io.IOUtils Import]

+0

Witam, w rzeczywistości jest to komentowane w zadanym przeze mnie pytaniu i próbowałem go. Jednak równie dobrze zużywałem swój strumień wejściowy, a na koniec było to nie do przyjęcia. Dziękuję Ci!. – Eduardo

+0

Możesz użyć danych ciągu tyle razy, ile chcesz. Ponieważ nie można odczytać strumienia wstecz i napotkasz wiele problemów w dół dla takiej obsługi – Reddy

+0

Tak, mogę używać napisu tyle razy, ile chcę, ale jednak potrzebowałem dwa razy strumienia wejściowego, aby przekonwertować go na ciąg (znać odpowiednią wersję SOAP, której powinienem użyć) i drugi raz, aby przekonwertować strumień wejściowy na komunikat SOAP. – Eduardo

Powiązane problemy