2011-11-04 58 views
0

嗨,我有一个问题,我无法解决。 在我的Android \ java应用程序中,我调用脚本download.php。基本上它提供了一个文件输出,我下载并保存在我的设备上。我必须在我的所有php脚本上添加一个控件,基本上就是向脚本发送一个令牌并检查它是否有效。如果它是一个有效的标记,我会得到输出(在这种情况下,其他脚本中的文件是一个json文件),如果不是,我会返回一个字符串“false”。java:错误检查php输出

要在我的其他Java文件检查此条件,我用IOUtils方法输入流变成一个字符串,检查,而且比

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

再次获得一个有效的输入流和读吧.. ....它与我的JSON文件,但不是在这种情况下......我得到这个错误:当我尝试IOUtils.toString(inputStream, "UTF-8");

我认为这是

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

因为在此CA我试图下载真正的长文件。

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

文件多长/多大? – Mob

回答

1

请勿将流读取为开头的字符串。将它保存为二进制数据,并从读取前5个字节开始。然后你可以检查这5个字节是否是UTF-8中用于编码“假”的5个字节,如果是这样的话就会相应地采取行动。否则,将这5个字节写入输出文件,然后执行与之前相同的循环/读取/写入操作。请注意,要读取这5个字节,您可能需要循环(但似乎不太可能)。也许你的IOUtils类可以说“读取至少5个字节”?请问真实内容是否比更小比5个字节?

说实话,它会更好,如果你可以使用一个头在响应以表示不同的结果,而不是只是一个“假”身体 - 你的PHP脚本的控制?

+0

当然,我但但我不擅长与PHP。在我的脚本里面我有3个可能的输出:1)打印json_encode($ something); 2)echo“false”3)readfile($ file);我怎么能添加一个头来知道我正在处理什么样的输出?这将是最好的解决方案.... – Sgotenks