2016-10-07 1 views
-1

Окружающая среда: перенаправление входного файла, используемое при запуске программы, IDE: Eclipse.Java: Получение разного выхода каждый раз, когда я запускаю программу для того же входа

Я читаю пакеты из System.in (поскольку используется перенаправление ввода) и подсчитывает количество пакетов. Каждый раз, когда я запускаю программу для одного и того же ввода, я получаю разные значения (все неправильно). Кроме того, я получаю правильный счет, когда я показываю много вещей на консоли.

int packetNumber = 0; 
while(System.in.available()>0) 
{ 
    System.out.println("\n" + packetNumber + ": "); 
    int numberOfBytes = System.in.read(); 
    byte[] buffer = new byte[numberOfBytes]; 
    System.in.read(buffer, 0, numberOfBytes); 
    packetNumber++; 
} 
System.out.println("Number of packets = " + packetNumber); 

работает нормально с System.out.println(), но странно себя без него

Спасибо заранее.

+0

Читать ответ Майк Nakis в http://stackoverflow.com/questions/15446689/what-is-the-use-of-system-in-read-in-java –

+1

Ваш код не complete - откуда берутся 'packetNumber' и' numberOfBytes'? –

+0

@ SimonMᶜKenzie, я добавил packetNumber и numberOfBytes в код –

ответ

0

read(byte[] b, int off, int len) не требуется, чтобы заполнить буфер:

считывает до len байт данных из входного потока в массив байтов. Делается попытка прочитать целых len байт, , но меньшее число может быть прочитано. Число фактически прочитанных байтов возвращается как целое число.

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

Предполагая, что каждый вызов read() возвращает один «пакет», определенно, неверен.

Если вы фиксируете возвращаемое значение как bytesRead и суммируете их, вы всегда должны получать одинаковые суммы.

byte[] buffer = new byte[numberOfBytes]; 
int totalBytes = 0; 
int bytesRead; 
while ((bytesRead = System.in.read(buffer)) != -1) { 
    totalBytes += bytesRead; 
} 
System.out.println("Received " + totalBytes + " bytes"); 
+0

numberOfBytes в моем коде (отредактированном) динамически вычисляется из входного потока, а затем я должен читать байты numberOfBytes в «buffer». Я понимаю, что чтение (byte [] buffer, int off. Int len) читается до len байтов, но как я могу обеспечить чтение всех len-байтов? –

+0

Продолжайте читать, пока у вас не будет всех байтов. Также имейте в виду, что no-arg 'read()' возвращает один байт, но как 'int' (0-255) или -1 для EOF. Не вводите в заблуждение типа 'int' return, чтобы думать, что вы читаете полное 4-байтовое целочисленное значение. – Andreas

+0

чтение байта по байту как int, а затем литье в байты - это решение, но пыталось найти более эффективное решение для (int i = 0; i

Смежные вопросы