2013-10-26 83 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(); 

等。當然,這是假設你正在從控制檯輸入信息。