Как отправить EOF для элемента Java InputStream?

поэтому у меня есть следующий код, открывающий входной поток и успешно собирающий информацию:

             httpInput = httpConnection.openInputStream();               

             sb= new StringBuffer();             

             while (ch != -1) 
             {
                 ch = httpInput.read();
                 sb.append((char)ch);
             }

однако, когда я пытаюсь использовать ту же строку (sb.toString ()) в другом методе, я получаю сообщение об ошибке «Ожидается конец файла». так как мне прикрепить символ EOF к моей строке? ПРИМЕЧАНИЕ: ответ в основном представляет собой XML-документ, поступающий с удаленного сервера.

поэтому, когда код достигает строки "синтаксического анализа", он дает мне указанную выше ошибку:

бис = новый ByteArrayInputStream (sb.toString (). getBytes ()); doc = docBuilder.parse (бис);

Я кодирую это для приложения Blackberry.

ac


person sexitrainer    schedule 03.02.2010    source источник


Ответы (4)


Если вы просто хотите прочитать поток в массив байтов, попробуйте использовать IOUtilities.streamToBytes ()

person Marc Novakowski    schedule 03.02.2010
comment
это сработало как чемпион !!!! мне понравилось, как он сжал код до 1 строчки !!! Ницца. спасибо Марк !!!! - person sexitrainer; 04.02.2010

Одна большая проблема с этим кодом заключается в том, что вы, кажется, читаете по одному байту за раз и предполагаете, что каждый байт представляет собой один символ. Это совсем не обязательно так, но может сработать для некоторой простой кодировки, такой как ASCII. Чтение одного байта за раз также может быть очень медленным.

Я не знаю, что существует такая вещь, как символ EOF - обычно «EOF» - это значение -1, возвращаемое такими методами, как read (), но это не символ.

Что это за другой метод? какого именно персонажа он ожидает - вы можете узнать? тогда просто добавьте это? Непонятно, что вы на самом деле пытаетесь там сделать.

person Sean Owen    schedule 03.02.2010
comment
К сожалению, API Blackberry не позволяет мне читать более 1 байта за раз, используя объект InputStream микроиздания. Если есть какой-либо другой объект входного потока (в API Blackberry), который я могу использовать для чтения более одного байта за раз, сообщите мне, чтобы я мог его использовать. Благодарность! - person sexitrainer; 03.02.2010
comment
В InputStream есть метод чтения (byte [] b, int off, int len). - person Marc Novakowski; 03.02.2010

Последний вызов ch = httpInput.read(); дает вам значение -1, которое затем добавляется к вашему StringBuffer sb. Но этот код read() сообщает вам, что достиг конца потока, это не символ, который вы должны добавлять.

Вместо этого вы можете сделать это:

ByteArrayOutputStream out = new ByteArrayOutputStream();
while (true) 
{
    ch = httpInput.read();
    if( ch == -1 ) {
        break;
    }
    out.write( ch );
}
String result = out.toString( "utf-8" ); // or whatever charset is used

// or if you only need another InputStream:
ByteArrayInputStream in = new ByteArrayInputStream( out.getBytes() );
person tangens    schedule 03.02.2010

Возможно, сообщение об ошибке «Ожидается конец файла» в синтаксическом анализаторе XML не имеет ничего общего с символом EOF. Это может указывать на некоторую проблему синтаксиса XML (возможно, синтаксический анализатор XML обнаружил больше символов после конца правильно сформированного документа XML)

person axtavt    schedule 03.02.2010