Как я посмотрел на первые два байта в InputStream?

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

int x,age;
int total=0;
int nofpeople=0;
int average=0;

string check;

cout<<"Enter the ages and when you're done write 'OK'." << endl;

while(check!="OK")
{
    string temp;
    cin>>temp;
    istringstream iss(temp);
    iss >> x;
    if(x>0)
    {
        age=x;
        nofpeople++;
        total=total+age;
        average=total/nofpeople;
    }
    else if (temp.compare("OK") == 0)
    {
        check="OK";
    }
    else
    {
        cerr << "Invalid or negative number entered" << endl;
    } 
}
cout<<"Number of people you have entered=" << nofpeople << endl;
cout<<"Sum of ages=" << total<< endl;
cout<<"Average of ages=" <<average;
return 0;
30
задан Epaga 29 September 2008 в 10:34
поделиться

4 ответа

Для общего InputStream я перенес бы его в BufferedInputStream и сделал бы что-то вроде этого:

BufferedInputStream bis = new BufferedInputStream(inputStream);
bis.mark(2);
int byte1 = bis.read();
int byte2 = bis.read();
bis.reset();
// note: you must continue using the BufferedInputStream instead of the inputStream
50
ответ дан 27 November 2019 в 23:20
поделиться

Вы могли бы найти, что PushbackInputStream был полезен:

http://docs.oracle.com/javase/6/docs/api/java/io/PushbackInputStream.html

19
ответ дан 27 November 2019 в 23:20
поделиться

Когда использование BufferedInputStream удостоверяется, что inputStream уже не буферизуется, двойная буферизация заставит некоторых серьезно трудно находить ошибки. Также необходимо обработать Читателей по-другому, преобразовав в StreamReader, и Буферизация заставит байты быть потерянными, если Читатель будет Буферизован. Также, если Вы используете Читателя, помнят, что Вы не читаете байты, но символы в кодировке по умолчанию (если явное кодирование не было установлено). Примером буферизированного входного потока, который Вы не можете знать, является URL URL; url.openStream ();

у меня нет ссылок для этой информации, она прибывает из отладки кода. Основной случай, где проблема произошла для меня, был в коде, которые читают из файла в сжатый поток. Если я помню правильно, после того как Вы начинаете отлаживать через код существуют комментарии в источнике Java, что определенные вещи не работают правильно всегда. Я не помню, куда информация от использования BufferedReader и BufferedInputStream прибывает из, но я думаю что сбои немедленно даже на самом простом тесте. Не забудьте тестировать это, необходимо отмечать больше, чем размер буфера (который отличается для BufferedReader по сравнению с BufferedInputStream), проблемы происходят когда байты, считанные досягаемость конец буфера. Примечание там является размером буфера исходного кода, который может отличаться от размера буфера, который Вы устанавливаете в конструкторе. Это некоторое время, так как я сделал это так, мои воспоминания о деталях могут быть немного выключены. Тестирование было сделано с помощью FilterReader/FilterInputStream, добавьте тот к прямому потоку и один к буферизированному потоку для наблюдения различия.

5
ответ дан 27 November 2019 в 23:20
поделиться

Я нашел реализацию PeekableInputStream здесь:

http://www.heatonresearch.com/articles/147/page2.html

идея реализации, показанной в статье, состоит в том, что это сохраняет массив "посмотревших" значений внутренне. При вызове чтения значения возвращены сначала от посмотревшего массива, затем от входного потока. При вызове быстрого взгляда значения читаются и хранятся в "посмотревшем" массиве.

, Поскольку лицензия примера кода является LGPL, Это может быть присоединено к этому сообщению:

package com.heatonresearch.httprecipes.html;

import java.io.*;

/**
 * The Heaton Research Spider Copyright 2007 by Heaton
 * Research, Inc.
 * 
 * HTTP Programming Recipes for Java ISBN: 0-9773206-6-9
 * http://www.heatonresearch.com/articles/series/16/
 * 
 * PeekableInputStream: This is a special input stream that
 * allows the program to peek one or more characters ahead
 * in the file.
 * 
 * This class is released under the:
 * GNU Lesser General Public License (LGPL)
 * http://www.gnu.org/copyleft/lesser.html
 * 
 * @author Jeff Heaton
 * @version 1.1
 */
public class PeekableInputStream extends InputStream
{

  /**
   * The underlying stream.
   */
  private InputStream stream;

  /**
   * Bytes that have been peeked at.
   */
  private byte peekBytes[];

  /**
   * How many bytes have been peeked at.
   */
  private int peekLength;

  /**
   * The constructor accepts an InputStream to setup the
   * object.
   * 
   * @param is
   *          The InputStream to parse.
   */
  public PeekableInputStream(InputStream is)
  {
    this.stream = is;
    this.peekBytes = new byte[10];
    this.peekLength = 0;
  }

  /**
   * Peek at the next character from the stream.
   * 
   * @return The next character.
   * @throws IOException
   *           If an I/O exception occurs.
   */
  public int peek() throws IOException
  {
    return peek(0);
  }

  /**
   * Peek at a specified depth.
   * 
   * @param depth
   *          The depth to check.
   * @return The character peeked at.
   * @throws IOException
   *           If an I/O exception occurs.
   */
  public int peek(int depth) throws IOException
  {
    // does the size of the peek buffer need to be extended?
    if (this.peekBytes.length <= depth)
    {
      byte temp[] = new byte[depth + 10];
      for (int i = 0; i < this.peekBytes.length; i++)
      {
        temp[i] = this.peekBytes[i];
      }
      this.peekBytes = temp;
    }

    // does more data need to be read?
    if (depth >= this.peekLength)
    {
      int offset = this.peekLength;
      int length = (depth - this.peekLength) + 1;
      int lengthRead = this.stream.read(this.peekBytes, offset, length);

      if (lengthRead == -1)
      {
        return -1;
      }

      this.peekLength = depth + 1;
    }

    return this.peekBytes[depth];
  }

  /*
   * Read a single byte from the stream. @throws IOException
   * If an I/O exception occurs. @return The character that
   * was read from the stream.
   */
  @Override
  public int read() throws IOException
  {
    if (this.peekLength == 0)
    {
      return this.stream.read();
    }

    int result = this.peekBytes[0];
    this.peekLength--;
    for (int i = 0; i < this.peekLength; i++)
    {
      this.peekBytes[i] = this.peekBytes[i + 1];
    }

    return result;
  }

}
4
ответ дан 27 November 2019 в 23:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: