У меня есть исходный код работающего проекта, который, к сожалению, уже передан клиентам. Следующий код Java запускает процесс обновления:
public void downloadChanges() throws IOException {
try (InputStream is = WebClient.doRawRequest(HttpMethod.GET, machinePath + "/update/", null)) { //IOexception is thrown outside
if (is.available() == 0) {
logInfo("Nothing downloaded");
}
//continue with downloaded stuff
}
}
Теперь мне нужно написать для этого новый бэкэнд.
Я не знаю, какого черта is.available() всегда возвращает 0.
Я узнал, что InputStream.available() не работает
но поскольку изменение кода Java здесь невозможно, я открыл новую тему.
Я попробовал добавить код отладки для тестирования в коде Java, поэтому он выглядел бы так:
if (is.available() == 0) {
byte[] data = is.readNBytes(2048 * 1024);
String content = new String(data, StandardCharsets.UTF_8);
System.out.println(content);
System.out.println("Nothing downloaded.");
return;
}
В этом случае я получаю полный и правильный ответ от своего программного обеспечения PHP.
У кого-нибудь есть идеи, как правильно настроить мой php для работы с is.available?
Я не могу изменить код Java, и мне нужно запустить сервер, каким бы хакерским это ни было.
Мы не можем посетить каждого клиента по всему миру....
InputStream является абстрактным, а InputStream.available() всегда возвращает 0, согласно javadoc. is.readNBytes — это блокирующее чтение размером до 2 МБ. Я думаю, вам следует изучить определение WebClient, которое расширяет InputStream и реализует все, что вам нужно. Кроме того, есть ли у вас какой-то код, уже взаимодействующий с этой Java, чтобы вы могли иметь представление о том, чего он ожидает от кода Java, который вы показываете, - но вам не разрешено его изменять?
Вам необходимо исправить ошибку в вашем коде. Вот и все
Я не могу изменить код Java, поскольку код Java был создан другой компанией и уже отправлен нашим клиентам, поэтому невозможно предоставить обновление без работающей функции обновления. (из-за использования имеющихся()) ...... Большое спасибо за ответ
WebClient.doRawRequest() отправит запрос на сервер и немедленно вернет InputStream. Поскольку данные InputStream будут доступны только после того, как сервер обработает запрос и доставит данные, вызов is.available() вернет 0 (поскольку в этот момент чтение данных будет заблокировано). Со стороны PHP вы ничего не можете сделать, чтобы это изменить.
Тогда клиенты могут либо пожаловаться, либо, что еще хуже, молча уйти.
Если этот код является частью функции обновления (и, следовательно, невозможно предоставить обновление без работающей функции обновления), то у вас нет рабочей функции обновления - за исключением доставки нового кода Java вашим клиентам.
Таким образом, вы можете отследить проблему в своей локальной среде (куда вы вставили отладочный код), что означает, что проверка кода всего один раз перед развертыванием среди клиентов выявила бы проблему. Если это не послужит уроком…
Спасибо, что не поняли мою проблему @Holger. Я декомпилировал код, чтобы просмотреть его, а ЗАТЕМ создал свою локальную среду.
Итак, вы говорите, что код сразу ниже. Я попытался добавить некоторый код отладки для тестирования в коде Java, чтобы он выглядел так: является ли результат декомпиляции?
Я не понимаю, какое имеет значение, декомпилировали ли вы код для его тестирования. Дело в том, что этот код настолько фундаментально сломан, что его одноразовое тестирование выявило бы проблему, и теперь ваша компания расплачивается за развертывание совершенно непроверенного программного обеспечения для клиентов.




Спасибо, ребята, за то, что помогли мне!
Ответы:
Метод available() не предназначен для того, чтобы делать с ним то, что вы хотите. Невозможно настроить программное обеспечение PHP так, чтобы метод делал то, что вы хотите. Если вы хотите сохранить содержимое InputStream в локальный файл, просто используйте Files.copy, если вы хотите прочитать его в массив байтов, используйте is.readAllBytes() –
Хольгер
WebClient.doRawRequest() отправит запрос на сервер и немедленно вернет InputStream. Поскольку входной поток будет иметь данные, доступные только после того, как сервер обработает запрос и доставит данные, вызов is.available() вернет 0 (поскольку в этот момент чтение данных будет заблокировано). Со стороны PHP вы ничего не можете сделать, чтобы это изменить. –
Томас Клэгер
Сейчас я пытаюсь закрыть эту тему.
Метод
available()не предназначен для того, чтобы делать с ним то, что вы хотите. Невозможно настроить программное обеспечение PHP так, чтобы метод делал то, что вы хотите. Если вы хотите сохранить содержимоеInputStreamв локальный файл, просто используйте Files.copy , если вы хотите прочитать его в массив байтов, используйте is.readAllBytes()