InputStream.available() странное поведение

У меня есть исходный код работающего проекта, который, к сожалению, уже передан клиентам. Следующий код 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, и мне нужно запустить сервер, каким бы хакерским это ни было. Мы не можем посетить каждого клиента по всему миру....

Метод available() не предназначен для того, чтобы делать с ним то, что вы хотите. Невозможно настроить программное обеспечение PHP так, чтобы метод делал то, что вы хотите. Если вы хотите сохранить содержимое InputStream в локальный файл, просто используйте Files.copy , если вы хотите прочитать его в массив байтов, используйте is.readAllBytes()

Holger 03.07.2024 10:24

InputStream является абстрактным, а InputStream.available() всегда возвращает 0, согласно javadoc. is.readNBytes — это блокирующее чтение размером до 2 МБ. Я думаю, вам следует изучить определение WebClient, которое расширяет InputStream и реализует все, что вам нужно. Кроме того, есть ли у вас какой-то код, уже взаимодействующий с этой Java, чтобы вы могли иметь представление о том, чего он ожидает от кода Java, который вы показываете, - но вам не разрешено его изменять?

догонят 03.07.2024 10:32

Вам необходимо исправить ошибку в вашем коде. Вот и все

g00se 03.07.2024 10:49

Я не могу изменить код Java, поскольку код Java был создан другой компанией и уже отправлен нашим клиентам, поэтому невозможно предоставить обновление без работающей функции обновления. (из-за использования имеющихся()) ...... Большое спасибо за ответ

Blue Nachid 03.07.2024 10:50
WebClient.doRawRequest() отправит запрос на сервер и немедленно вернет InputStream. Поскольку данные InputStream будут доступны только после того, как сервер обработает запрос и доставит данные, вызов is.available() вернет 0 (поскольку в этот момент чтение данных будет заблокировано). Со стороны PHP вы ничего не можете сделать, чтобы это изменить.
Thomas Kläger 03.07.2024 10:50

Тогда клиенты могут либо пожаловаться, либо, что еще хуже, молча уйти.

g00se 03.07.2024 10:52

Если этот код является частью функции обновления (и, следовательно, невозможно предоставить обновление без работающей функции обновления), то у вас нет рабочей функции обновления - за исключением доставки нового кода Java вашим клиентам.

Thomas Kläger 03.07.2024 12:40

Таким образом, вы можете отследить проблему в своей локальной среде (куда вы вставили отладочный код), что означает, что проверка кода всего один раз перед развертыванием среди клиентов выявила бы проблему. Если это не послужит уроком…

Holger 04.07.2024 11:04

Спасибо, что не поняли мою проблему @Holger. Я декомпилировал код, чтобы просмотреть его, а ЗАТЕМ создал свою локальную среду.

Blue Nachid 04.07.2024 11:43

Итак, вы говорите, что код сразу ниже. Я попытался добавить некоторый код отладки для тестирования в коде Java, чтобы он выглядел так: является ли результат декомпиляции?

g00se 04.07.2024 12:01

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

Holger 04.07.2024 12:22
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
11
87
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Спасибо, ребята, за то, что помогли мне!

Ответы:

Метод available() не предназначен для того, чтобы делать с ним то, что вы хотите. Невозможно настроить программное обеспечение PHP так, чтобы метод делал то, что вы хотите. Если вы хотите сохранить содержимое InputStream в локальный файл, просто используйте Files.copy, если вы хотите прочитать его в массив байтов, используйте is.readAllBytes() – Хольгер

WebClient.doRawRequest() отправит запрос на сервер и немедленно вернет InputStream. Поскольку входной поток будет иметь данные, доступные только после того, как сервер обработает запрос и доставит данные, вызов is.available() вернет 0 (поскольку в этот момент чтение данных будет заблокировано). Со стороны PHP вы ничего не можете сделать, чтобы это изменить. – Томас Клэгер

Сейчас я пытаюсь закрыть эту тему.

Другие вопросы по теме