Sgotenks
Sgotenks

Reputation: 1733

java: error checking php output

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();

Upvotes: 0

Views: 253

Answers (1)

Jon Skeet
Jon Skeet

Reputation: 1502985

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?

Upvotes: 1

Related Questions