2012-11-08 23 views
7

tôi đã sử dụng câu hỏi nàyTạo một bản sao của một InputStream từ một HttpURLConnection để nó có thể được sử dụng hai lần

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

để chuyển đổi một InputStream vào một String với mã này:

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 đến từ một HttpURLConnection InputStream, và khi tôi chuyển đổi sang String, các thay đổi của inputstream và tôi không thể sử dụng nó nữa. Đây là lỗi mà tôi nhận được:

Premature end of file.' SOAP 

Tôi có thể làm gì để giữ luồng nhập, khi tôi chuyển đổi chuỗi thành thông tin thích hợp ?.

Speciffically đây là thông tin rằng những thay đổi:

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

Cảm ơn bạn.

+0

Eduardo: là nó có thể cho bạn để tạo InputStream khác và sử dụng nó cho các khách hàng thứ hai? Sau khi đọc dữ liệu trong phương thức này (convertStreamToString), bạn có thể đưa dữ liệu này trở lại vào một luồng khác (ví dụ: ByteArrayInputStream) và sau đó gửi nó cho ứng dụng khách thứ hai của bạn cần đọc cùng một dữ liệu từ luồng đầu vào. – mhshams

+0

Xin chào Mohammad, tôi nghĩ tôi không hoàn toàn hiểu ý bạn. Bạn có thể trả lời câu hỏi để biết thêm chi tiết không ?. Tôi sẽ rất vui khi được cung cấp cho bạn tiền thưởng nếu nó hoạt động tốt. Có bạn là đúng trong bình luận của bạn cho câu hỏi khác, tôi cần phải giữ nguyên InputStream của tôi để chuyển đổi nó sau đó đúng vào một tin nhắn SOAP. Cảm ơn bạn!. – Eduardo

Trả lời

10

Nếu bạn chuyển luồng đầu vào của bạn vào máy quét hoặc đọc dữ liệu của nó theo bất kỳ cách nào khác. bạn thực sự tiêu thụ dữ liệu của nó và sẽ không còn dữ liệu nào trong luồng đó nữa.

bạn có thể cần phải tạo luồng đầu vào mới với cùng một dữ liệu và sử dụng nó thay vì dữ liệu gốc. ví dụ:

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

Tôi thấy rằng bạn đặt 4096, Nó hoạt động tốt. Tuy nhiên Làm thế nào tôi có thể nhận được kích thước của inputstream ?, Tôi không thấy một phương thức nhận được ?. Cảm ơn bạn!. – Eduardo

+2

số đó (4096) chỉ là kích thước bộ đệm. bạn có thể chọn bất kỳ số nào khác mà bạn thích.bạn không thể tìm thấy kích thước luồng đầu vào mà không đọc nó. bạn có thể sử dụng InputStream.available(), nhưng nó sẽ trả về số byte hiện tại có sẵn trong luồng. trên thực tế, kích thước luồng có thể thay đổi trong thời gian bạn đọc. do đó giải pháp duy nhất được đảm bảo là dữ liệu đã đọc cho đến khi bạn đến cuối luồng. – mhshams

2

Máy quét đọc đến cuối luồng và đóng nó lại. Vì vậy, nó sẽ không có sẵn hơn nữa. Sử dụng PushbackInputStream làm trình bao bọc cho luồng đầu vào của bạn và sử dụng phương thức unread().

+0

Hi Antony, tôi tin rằng bạn đúng. Tuy nhiên làm thế nào để tôi sử dụng phương thức chưa đọc() mà bạn đề cập đến ?. Cảm ơn rất nhiều!!!. – Eduardo

+1

@Antony bằng cách sử dụng PushbackInputStream bạn KHÔNG THỂ đọc dữ liệu trong InputStream gốc. Tôi nghĩ Eduardo cần giữ nguyên InputStream nguyên bản (kết nối từ kết nối URL) nguyên vẹn. – mhshams

0

Hãy thử sử dụng Tiện ích Apache. Trong dự án cài đặt trước của tôi, tôi đã làm điều tương tự

InputStream xml = connection.getInputStream();

Trả lời chuỗiData = IOUtils.toString (xml);

Bạn có thể nhận IOUtils từ Apache [nhập khẩu org.apache.commons.io.IOUtils]

+0

Xin chào, thực sự điều này được nhận xét trong câu hỏi tôi đã đăng và tôi đã thử nó. Tuy nhiên, tôi cũng tiêu thụ nguồn đầu vào của mình và cuối cùng nó không thể chấp nhận được. Cảm ơn bạn!. – Eduardo

+0

Bạn có thể sử dụng dữ liệu chuỗi bao nhiêu lần tùy thích. Vì luồng không thể đọc ngược và bạn sẽ gặp rất nhiều vấn đề trong đường dây hỗ trợ như vậy – Reddy

+0

Có, tôi có thể sử dụng chuỗi bao nhiêu lần tùy ý, nhưng tuy nhiên tôi cần đầu vào hai lần, một lần được chuyển thành Chuỗi (để biết phiên bản SOAP phù hợp mà tôi nên sử dụng), và lần thứ hai để chuyển đổi luồng đầu vào thành một thông báo SOAP. – Eduardo

Các vấn đề liên quan