2013-10-26 55 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不会等待任何\nEOF包装和读取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); 
} 

但是,如果我送_source2in.read(_source2.getBytes())所以我Scanner等待,我只看到

请输入R:

任何想法?

回答

3

线

in.read(_source2.getBytes()); 

没有新的信息添加到输入流,而不是将其清空它,如果有会是更多的数据。所以输入流已经耗尽。

您只需要在下次调用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(); 

等。当然,这是假设你正在从控制台输入信息。