2013-10-26 5 views
0

Я пытаюсь отправить строку в моей InputStream:Java: отправить строку в поток ввода

String _source = "123"; 
InputStream in = new ByteArrayInputStream(_source.getBytes("UTF-8")); 
tempLab2.readR(in); 

String _source2 = "321"; 
in.read(_source2.getBytes()); 
_myClass.readR(in); 

Когда я создаю новый ByteArrayInputStream и установить _source в качестве аргумента, то все работает хорошо. Мой метод readR не дождался \n или EOF. Обозначения и цифры 123.

Пожалуйста, введите R:

R: 123

readR метод:

public void readR(InputStream inpSteram) { 
    Scanner tScanner = new Scanner(inpSteram); 
    System.out.println("Please enter R:"); 
    _R = tScanner.nextDouble(); 
    System.out.println("R: " + _R); 
} 

Но если я посылаю _source2 с in.read(_source2.getBytes()) так мой Scanner ждет, и я вижу только

Пожалуйста, введите R:

Любые идеи?

ответ

3

Линия

in.read(_source2.getBytes()); 

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

Вам просто нужно создать новый входной поток перед следующим вызовом readR. Итак:

String _source2 = "321"; 
in = new ByteArrayInputStream(_source2.getBytes("UTF-8")); 
_myClass.readR(in); 
+0

Есть ли способ без создания нового ByteArrayInputStream? – Leo

+1

Нет. Когда вы создаете ByteArrayInputStream, вы не можете его подавать с новыми байтами. Вы можете изменить readR, чтобы принять String и создать входной поток внутри метода. – Wouter

2

Ваш код не имеет смысла:

String _source2 = "321"; 
in.read(_source2.getBytes()); 

in.read() считывает байты из in, и сохраняет то, что он прочитал в байтовый массив передается в качестве аргумента. Таким образом, приведенный выше код создает массив длиной в три байта, заполняет его 3 байтами, а затем пытается прочитать байты из входного потока и заполняет массив байтов длиной 3 байта.

+1

Okey, но вы не ответили, как это исправить. – Leo

0

Не используйте InputStream для работы с символами, используйте Reader.

Кроме того, в вашем втором примере вы не делаете то, что думаете, что делаете. вы не добавляете байты _source2 во входной поток. вы вместо этого пытаетесь повторно использовать исходные байты из исходного InputStream, который теперь пуст.

0

Это не совсем очевидно, что вы после того, как здесь, но при использовании Scanner класса, вы можете просто отправить строку прямо на него так:

Scanner scanner = new Scanner(System.in); 
String s = scanner.nextLine(); 

И так далее. Это предполагает, конечно, что вы принимаете входные данные с консоли.

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