System.setIn + zwei Scanner auf ByteArrayInputStream

06/11/2015 - 21:13 von Robert Hartmann | Report spam
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("HalloWelt".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();
}
}
 

Lesen sie die antworten

#1 ram
07/11/2015 - 01:31 | Warnen spam
Robert Hartmann writes:
Warum erhàlt im unteren Beispiel, die zweite
Scanner-Instanz nicht den Teil "Welt" ?



Weil der erste Scanner schon früh erst einmal alles aus
dem java.io.ByteArrayInputStream destruktiv in einen Puffer
(1024 Bytes?) liest.

public final class Main
{ public static void main( final java.lang.String[] args )
{ final byte[] bytes = "HalloWelt".getBytes();
java.lang.System.setIn( new java.io.ByteArrayInputStream( bytes ));
final java.util.Scanner sc
= new java.util.Scanner( java.lang.System.in );
java.lang.System.setIn( new java.io.ByteArrayInputStream( bytes ));
final java.util.Scanner sc1
= new java.util.Scanner( java.lang.System.in );
final java.lang.String s = sc.next();
System.out.println( "s= "+ s );
final java.lang.String s1 = sc1.next();
System.out.println( "s1= "+ s1 ); }}

Ähnliche fragen