Path: csiph.com!news.swapon.de!aioe.org!.POSTED!not-for-mail From: Robert Hartmann Newsgroups: de.comp.lang.java Subject: System.setIn + zwei Scanner auf ByteArrayInputStream Date: Fri, 6 Nov 2015 21:13:35 +0100 Organization: Aioe.org NNTP Server Lines: 78 Message-ID: NNTP-Posting-Host: 8zmAJu3QidHcjh2saS/aQA.user.speranza.aioe.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit X-Complaints-To: abuse@aioe.org User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:38.0) Gecko/20100101 Thunderbird/38.3.0 X-Notice: Filtered by postfilter v. 0.8.2 X-Mozilla-News-Host: news://news.aioe.org:119 Xref: csiph.com de.comp.lang.java:12857 Hallo zusammen, Unabhängig von der grundsätzlichen Frage, ob man zwei verschiedene java.util.Scanner-Instanzen auf System.in überhaupt "los lassen" können sollte, stellt sich mir nun die tatsächlich praktische Frage: Warum erhält im unteren Beispiel, die zweite Scanner-Instanz nicht den Teil "Welt" ? Wenn ich System.in per System.setIn auf den ByteArrayInputStream umbiege? Aufschließende Frage: Wenn ich ein Modul-Teste (per JUnit4), und dieses Modul nutzt den Scanner, wie kann ich System.in so umbiegen, dass eine beliebige Anzahl von Instanzen des Scanners die vorgegebenen Testeingaben zu Gesicht bekommt? Konkreter: Es soll also für den Test kein Unterschied machen, ob im zu testenden Modul Scanner sc = new Scanner(System.in); String A=sc.next(); String B=sc.next() oder Scanner scA = new Scanner(System.in); Scanner scB = new Scanner(System.in); String A=scA.next(); String B=scB.next() steht. Ich wünsche ein schönes Wochenende, Gruß Robert /******** 8< ****************/ import java.io.ByteArrayInputStream; import java.util.Scanner; public class SystemInTest { public static void main(String[] args) { ByteArrayInputStream inbuf = new ByteArrayInputStream("Hallo\nWelt\n".getBytes()); System.setIn(inbuf); Scanner sc1 = new Scanner(System.in); String s1 = sc1.next(); if (sc1.hasNext()){ System.out.println("sc1: found next okay, open new Scanner:"); Scanner sc2 = new Scanner(System.in); if (sc2.hasNext()){ String s2 = sc2.next(); System.out.println("S2= "+s2); } else { System.err.println("sc2 no next"); } sc2.close(); } System.out.println("S1= "+s1); sc1.close(); } }