Java inputtream читается дважды - PullRequest
0 голосов
/ 21 февраля 2019

Я могу прочитать первую строку из входного потока и сохранить ее в строковой переменной. Затем, как мне прочитать оставшиеся строки и скопировать в другой входной поток для дальнейшей обработки.

        InputStream is1=null;
        BufferedReader reader = null;
        String todecrypt = null;
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        try {
            reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
            todecrypt =  reader.readLine(); // this will read the first line
             String line1=null;
             while ((line1 = reader.readLine()) != null){ //loop will run from 2nd line
                 is1 = new ByteArrayInputStream(line1.getBytes()); 
             }
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e.getMessage());

        }

        System.out.println("to decrpt str==="+todecrypt);

, тогда я будуиспользуйте is1 в качестве другого входного потока из второй строки, и мой образец файла отправляется сюда

файл образца

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Поскольку вы используете средства чтения (BufferedReader и InputStreamReader), они читают данные из исходного потока (переменная inputStream) в виде символов, а не байтов.Поэтому после прочтения первой строки из читателя исходный поток будет пустым.Это потому, что читатель попытается заполнить весь буфер символов (по умолчанию это defaultCharBufferSize = 8192 символов).Таким образом, вы больше не можете использовать оригинальный поток, потому что у него больше нет данных.Вы должны прочитать оставшиеся символы из существующей программы чтения и создать новый InputStream с оставшимися данными.Пример кода ниже:

public static void main(String[] args) throws Exception  {
    ByteArrayInputStream bais = new ByteArrayInputStream("line 1 \r\n line 2 \r\n line 3 \r\n line 4".getBytes());
    BufferedReader reader = new BufferedReader(new InputStreamReader(bais));
    System.out.println(reader.readLine());
    StringBuilder sb = new StringBuilder();
    int c;
    while ((c = reader.read()) > 0)
        sb.append((char)c);
    String remainder = sb.toString();
    System.out.println("`" + remainder + "`");
    InputStream streamWithRemainingLines = new ByteArrayInputStream(remainder.getBytes());
}

Обратите внимание, что \r\n не потеряны

0 голосов
/ 21 февраля 2019

Расширяя комментарий Джерри Чина до полного ответа:

Вы можете просто сделать

    BufferedReader reader = null;
    String todecrypt = null;
    try {
        reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
        todecrypt =  reader.readLine(); // this will read the first line
    } catch (Exception e) {
        e.printStackTrace();
        throw new RuntimeException(e.getMessage());
    }

    System.out.println("to decrpt str==="+todecrypt);

    //This will output the first character of the second line
    System.out.println((char)inputStream.read());

Вы можете представить Inputstream в виде строки символов.Чтение символа - это удаление первого символа в строке.После этого вы все еще можете использовать Inputstream, чтобы читать больше символов.BufferedReader просто читает InputStream, пока не найдет '\ n'.

...