मैं आने वाले HttpServletRequest (नीचे 'अनुरोध') से अनुरोध स्ट्रीम (gzipped डेटा युक्त) पढ़ने के लिए कुछ लिख रहा हूं, हालांकि ऐसा लगता है कि सामान्य इनपुटस्ट्रीम रीड विधि वास्तव में सभी सामग्री को नहीं पढ़ती है?इनपुटस्ट्रीम.read (बाइट [], 0 लंबाई) जल्दी बंद हो जाता है?
मेरे कोड था:
InputStream requestStream = request.getInputStream();
if ((length = request.getContentLength()) != -1)
{
received = new byte[length];
requestStream.read(received, 0, length);
}
else
{
// create a variable length list of bytes
List<Byte> bytes = new ArrayList<Byte>();
boolean endLoop = false;
while (!endLoop)
{
// try and read the next value from the stream.. if not -1, add it to the list as a byte. if
// it is, we've reached the end.
int currentByte = requestStream.read();
if (currentByte != -1)
bytes.add((byte) currentByte);
else
endLoop = true;
}
// initialize the final byte[] to the right length and add each byte into it in the right order.
received = new byte[bytes.size()];
for (int i = 0; i < bytes.size(); i++)
{
received[i] = bytes.get(i);
}
}
क्या मैं परीक्षण के दौरान पाया था कि कभी कभी शीर्ष भाग (जब एक सामग्री की लंबाई मौजूद है के लिए) बस भेजे अनुरोध स्ट्रीम के माध्यम से भाग रास्ता पढ़ने रोकने के लिए और शेष छोड़ना होगा 'प्राप्त' बाइट सरणी खाली। अगर मैं इसे हर समय अगर कथन का दूसरा हिस्सा चलाता हूं, तो यह ठीक पढ़ता है और सभी अपेक्षित बाइट 'प्राप्त' में रखे जाते हैं।
तो ऐसा लगता है कि मैं अभी उस परिवर्तन के साथ अकेले अपना कोड छोड़ सकता हूं, लेकिन क्या किसी को कोई विचार है कि सामान्य 'पढ़ा' (बाइट [], int, int) 'विधि क्यों पढ़ना बंद कर दिया? विवरण कहता है कि फ़ाइल का अंत मौजूद होने पर यह रुक सकता है। क्या यह हो सकता है कि gzipped डेटा बस उस बाइट्स को शामिल करने के लिए हुआ जो उसके लिए हस्ताक्षर जैसा दिखता है?
बीटीडब्ल्यू, आप [GZIPInputStream] (http://docs.oracle.com/javase/7/docs/api/java/util/zip/GZIPInputStream.html) पर एक नज़र डालना चाहते हैं। सब कुछ एक बाइट सरणी में पढ़ने के बजाय और फिर डेटा को अलग-अलग डंप्रेस करने के बजाय आप केवल कच्चे इनपुटस्ट्रीम को GZIPInputStream में लपेट सकते हैं और सीधे डिकंप्रेस्ड डेटा पढ़ सकते हैं। –
आह, कारण हम सीधे ऐसा नहीं करते हैं क्योंकि कभी-कभी हमें अन्य सिस्टम से प्राप्त इनपुट वास्तव में gzipped नहीं होता है, हालांकि यह माना जाता है ... :) –