Чтение строки текста из входного потока в Java с сохранением символа (ов) завершения строки - PullRequest
12 голосов
/ 15 декабря 2010

У меня есть этот код на Java:

InputStreamReader isr = new InputStreamReader(getInputStream());
BufferedReader ir = new BufferedReader(isr);
String line;
while ((line = ir.readLine()) != null) {
 //do stuff with "line"
}

Если входной поток содержит следующее: "hello \ nhey \ ryo \ r \ ngood-day", то строковая переменная будет следовать на каждой итерации:

  1. привет
  2. эй
  3. йо
  4. добрый день

Я хочу прочитать одну строку ввремя, но я хочу сохранить символ (ы) окончания строки:

  1. привет \ n
  2. эй \ r
  3. йо \ r \ n
  4. добрый день

Как я могу это сделать?Есть ли готовые классы, которые я могу использовать?

-

Обновление:

Вот что я пытаюсь сделать и почему янеобходимо сохранить символ конца строки (и почему символ EOL может отличаться).

Я читаю запрос POST.Они состоят из чистых текстовых сообщений, где строки всегда заканчиваются \ r \ n (по стандартной спецификации).Однако запрос POST может содержать двоичные данные, которые могут содержать байты, которые выглядят как символы завершения для объектов Java Reader.

В моем примере загружается изображение.Данные изображения отправляются в одну строку.Однако двоичные данные изображения содержат байты, которые СЧИТАТЕЛЬ будет интерпретировать как "\ n", "\ r" или иногда "\ r \ n", если эти два байта находятся рядом друг с другом.

Я должен прочитать запрос POST по одной строке за раз, потому что это так работает.Я полагаю, я МОЖЕТ прочитать все, а затем разобрать все это.Но это неэффективно, особенно если загружается файл большого размера (скажем, 1024 МБ).

1 Ответ

4 голосов
/ 15 декабря 2010

Если вы хотите прочитать запрос HTTP POST, я настоятельно рекомендую использовать BufferedInputStream.read() (не BufferedReader!) Напрямую (без readLine -подобных промежуточных абстракций), обращая внимание на все детали вручную, включая обработкуCR и LF согласно HTTP RFC.

Вот мой ответ на ваш более конкретный вопрос (как именно реализовать readLine).Возможно, это не самое быстрое решение, но сложность по времени оптимальна, и он работает:

import java.io.BufferedReader;
import java.io.IOException;   
public class LineReader {   
  private int i = -2;
  private BufferedReader br;
  public OriginalLineReader(BufferedReader br) { this.br = br; }
  public String readLine() throws IOException {
    if (i == -2) i = br.read();
    if (i < 0) return null;
    StringBuilder sb = new StringBuilder();
    sb.append((char)i);
    if (i != '\r' && i != '\n') {
      while (0 <= (i = br.read()) && i != '\r' && i != '\n') {
        sb.append((char)i);
      }
      if (i < 0) return sb.toString();
      sb.append((char)i);
    }
    if (i == '\r') {
      i = br.read();
      if (i != '\n') return sb.toString(); 
      sb.append((char)'\n');
    }
    i = -2;
    return sb.toString();
  }
}

Вы не найдете такого readLine встроенного в Java.Вероятно, вы найдете похожие, но не совсем совпадающие readLine s в стороннем .jar файле.Я рекомендую просто использовать приведенную выше, если вам действительно нужна эта функция.

...