My problem was that somehow, when I was downloading some data using a InputStream the object was locked, waiting for data forever, even when the transmission had already finished.
To solve that problem, considering that I didn't have control about the server, what I did was implement a kind of timeout to the InputStream.
For that, I read all the streaming, counting the time since the last time that some data had come. When it completed TIME_OUT milliseconds (in this case 1000) since the last reading, I manually stop the reading and created a new InputStream object with the data alright read.
Let's see the code!
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Calendar;
public class InputStreamUtils {
public static long TIME_OUT = 1000;
public static InputStream autoFinish(InputStream is) throws IOException{
if (is == null){
return null;
}
long lastTimeDataWasRead = Calendar.getInstance().getTimeInMillis();
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead = 0;
byte[] data = new byte[1024];
while (nRead != -1) {
if (is.available() == 0){
long timeSinceLastReading = Calendar.getInstance().getTimeInMillis() -
lastTimeDataWasRead;
if (timeSinceLastReading >= TIME_OUT){
nRead = -1;
break;
}
}
else{
lastTimeDataWasRead = Calendar.getInstance().getTimeInMillis();
nRead = is.read(data, 0, 1024);
if (nRead != -1){
buffer.write(data, 0 , nRead);
}
}
}
buffer.flush();
return (InputStream) new ByteArrayInputStream(buffer.toByteArray());
}
}
Yet, if you want to use the data as a byte array representation you can return buffer.toByteArray() instead of (InputStream) new ByteArrayInputStream(buffer.toByteArray()).