Java: InputStream.read не ожидает ввода?

#java #inputstream

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

Вопрос:

Добрый день, я работаю над прокси, но один из входных потоков сокета ведет себя странно:

 while(true) {
        try {
            while ((BytesRead = inputstream.read(Line)) != -1) {
                OtherSocket.Write(Line, BytesRead);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
  

У меня почти то же самое для OtherSocket, но на этом он продолжает повторяться, как будто сервер продолжает отправлять данные, я предполагаю, что inputstream.read(строка) не ожидает ввода, а возвращает -1. Есть ли какая-либо причина, по которой inputstream.read(строка) не будет ждать ввода, как это было задумано?

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

1. Это действительно Java? Это OtherSocket пользовательский класс?

2. Если этот код написан на Java, он использует однотипный стиль написания, что затрудняет понимание кода.

Ответ №1:

Я полагаю InputStream.read , что будет продолжать возвращать значение -1 после того, как сокет будет закрыт другим концом.

Почему вы хотите продолжать попытки чтения из потока, который уже вернул -1 из read ? Мне кажется, это ошибка. Если вы хотите сохранить while(true) цикл, вы должны поместить break; оператор после внутреннего цикла while, чтобы, если вам только что удалось нормально добраться до конца потока без проблем, вы могли просто выйти из внешнего цикла.

Я сильно подозреваю, что попытка чтения из потока после того, как он уже потерпел неудачу, тоже плохая идея, кстати.

(Я бы также посоветовал вам начать следовать более традиционным именованиям Java — очень странно видеть имена переменных PascalCase. Также странно видеть вызываемый метод Write — это, конечно, не что-то на java.io.OutputStream …)

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

1. Что касается ответа Джона, вы не показываете нам, какую реализацию InputStream вы используете. Каждый из них определяет условия EOF. Нам нужно знать конкретную реализацию, чтобы быть более полезными.