setIn并不是修改System.in,只是将输入重定向了。
输入重定向baidu一下就知道了。
简单的说,如果你将输入重定向到一个文件,你用System.in读到的就是文件的内容,而不是你在console里输入的内容。
setIn也许真的修改了System.in,但是setIn里是通过一个native方法来做的,很可能是用c实现的,
绕过了Java语法的限制(但是至少你看不到这个修改它的java语句)
这个可能对你有帮助:Java 1.0里,System.in的确不是final的
你可以直接给它赋值来重定向。看起来这不符合java之道,
所以java 1.1将它改为final,同时加入了setIn方法让你仍然可以做同样的事。
补充:看来System.in还是被改了。
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class T3 {
public static void main(String[] args) throws IOException {
InputStream a = System.in;
new File("hello").createNewFile();
System.setIn(new FileInputStream("hello"));
System.out.println(a);
System.out.println(System.in);
System.setIn(a);
System.out.println(System.in);
}
}