0

Hi i have a problem i'm not able to solve. In my Android\java application i call a script download.php. Basically it gives a file in output that i download and save on my device. I had to add a control on all my php scripts that basically consist in sending a token to the script and check if it's valid or not. If it's a valid token i will get the output (in this case a file in the other scripts a json file) if it's not i get back a string "false".

To check this condition in my other java files i used IOUtils method to turn the input stream to a String, check it, and than

InputStream newInputStream = new ByteArrayInputStream(mystring.getBytes("UTF-8"));

to get a valid input stream again and read it......it works with my JSon files, but not in this case......i get this error:

11-04 16:50:31.074: ERROR/AndroidRuntime(32363): java.lang.OutOfMemoryError

when i try IOUtils.toString(inputStream, "UTF-8");

I think it's because in this case i'm trying to download really long file.

fileOutput = new BufferedOutputStream(new FileOutputStream(file,false));
inputStream = new BufferedInputStream(conn.getInputStream());

String result = IOUtils.toString(inputStream, "UTF-8");
if(result.equals("false"))
{
     return false;
}
else
{
    Reader r = new InputStreamReader(MyMethods.stringToInputStream(result));
    int totalSize = conn.getContentLength();
    int downloadedSize = 0;
    byte[] buffer = new byte[1024];
    int bufferLength = 0;
    while ( (bufferLength = inputStream.read(buffer)) > 0 ) 
    {
        fileOutput.write(buffer, 0, bufferLength);
            downloadedSize += bufferLength;
}
fileOutput.flush();
fileOutput.close();
0

1 Answer 1

1

Don't read the stream as a string to start with. Keep it as binary data, and start off by just reading the first 5 bytes. You can then check whether those 5 bytes are the 5 bytes used to encode "false" in UTF-8, and act accordingly if so. Otherwise, write those 5 bytes to the output file and then do the same looping/reading/writing as before. Note that to read those 5 bytes you may need to loop (however unlikely that seems). Perhaps your IOUtils class has something to say "read at least 5 bytes"? Will the real content ever be smaller than 5 bytes?

To be honest, it would be better if you could use a header in the response to indicate the different result, instead of just a body with "false" - are you in control of the PHP script?

Sign up to request clarification or add additional context in comments.

1 Comment

Of course i am but but i'm not good with php. Inside my scripts i have 3 possible outputs: 1)print json_encode($something); 2)echo "false" 3)readfile($file); How could i add an header to know what kind of output i'm dealing with? This would be the best solution....

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.