java: проверка ошибок вывода php

#java #inputstream

#java #входной поток

Вопрос:

Привет, у меня проблема, которую я не могу решить. В моем приложении Android java я вызываю скрипт download.php . В основном это выдает файл на выходе, который я загружаю и сохраняю на своем устройстве. Мне пришлось добавить элемент управления во все мои php-скрипты, которые в основном состоят в отправке токена в скрипт и проверке, действителен он или нет. Если это допустимый токен, я получу вывод (в данном случае файл в других сценариях — файл json), если это не так, я получу обратно строку «false».

Чтобы проверить это условие в других моих файлах Java, я использовал метод IOUtils, чтобы превратить входной поток в строку, проверить его и затем

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

чтобы снова получить допустимый входной поток и прочитать it……it работает с моими файлами JSon, но не в этом случае …… я получаю эту ошибку:

11-04 16:50:31.074: ОШИБКА / AndroidRuntime (32363): java.lang.OutOfMemoryError

когда я пытаюсь IOUtils.toString(inputStream, "UTF-8");

Я думаю, это потому, что в этом случае я пытаюсь загрузить действительно длинный файл.

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

Ответ №1:

Не считывайте поток как строку для начала. Сохраните его как двоичные данные и начните с простого чтения первых 5 байтов. Затем вы можете проверить, являются ли эти 5 байтов теми 5 байтами, которые использовались для кодирования «false» в UTF-8, и действовать соответствующим образом, если это так. В противном случае запишите эти 5 байт в выходной файл, а затем выполните те же циклические операции / чтение / запись, что и раньше. Обратите внимание, что для чтения этих 5 байтов вам может потребоваться цикл (каким бы маловероятным это ни казалось). Возможно, вашему IOUtils классу есть что сказать «прочитать не менее 5 байт»? Будет ли реальное содержимое когда-либо меньше 5 байт?

Честно говоря, было бы лучше, если бы вы могли использовать заголовок в ответе, чтобы указать другой результат, а не просто тело с «false» — вы контролируете PHP-скрипт?

Комментарии:

1. Конечно, я, но, но я не силен в php. Внутри моих скриптов у меня есть 3 возможных вывода: 1) print json_encode ($ something); 2) echo «false» 3) readfile ($ file); Как я могу добавить заголовок, чтобы узнать, с каким видом вывода я имею дело? Это было бы лучшим решением….