查看源码可知,System.out 就是 PrintStram 类的实例
System.in 就是 InputStram类的实例
1. System.out
查看 System源码可知,System 是 java.lang 包下的一个类,out是其的静态成员,就是 OutputStream的实例
所以像下图代码那样写是完全可以的
public static void print(String str) {
// 查看源码可知 out 就是一个类静态成员,是一个 PrintStream 类的实例
// 也就是一个 输出流,所以此处完全可以用 PrintStram 的实例来接收 System.out
PrintStream ps = System.out;
ps.print(str);
}
2.既然我们知道了System.out 就是一个 OutputStram的实例,我们都知道,Os是可以输出到文件的,那么 System.out 是否可以输出到文件呢?答案是肯定的,肯定可以,代码如下图所示:
public static void printToFile(String str) throws FileNotFoundException {
// 查看源码可知,System有一个 setOut 方法,传入 OutputStram 参数
System.setOut(
new PrintStream(
new BufferedOutputStream(
new FileOutputStream("D:/print.txt")
)
)
);
System.out.print(str);
System.out.flush();
}
运行效果如下:
注意,此处,system.out 之后文件里面可能没内容,原因是没有 flush 强制刷新的原因,所以养成输出流输出完毕后强制刷新是个好习惯啊。这里其实可以使用 PrintStram 的另一个构造方法,加上一个 true ,自动强制刷新,就ok了
就像这样:
public static void printToFile(String str) throws FileNotFoundException {
// 查看源码可知,System有一个 setOut 方法,传入 OutputStram 参数
System.setOut(
new PrintStream(
new BufferedOutputStream(
new FileOutputStream("D:/print.txt",true)
)
,true)
);
System.out.print(str);
}
3.在输出到文件之后,输出了一会儿之后我又想输出到控制台呢?可不可以呢,肯定是可以的
查看System 源码的 initializeSystemClass() 源码,看到里面有这样一段代码
FileInputStream fdIn = new FileInputStream(FileDescriptor.in);
FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err);
所以要想回到控制台肯定还是 setOut 操作了,只不过是 new FileOutputStream()里面放的是 FileDescription.out了
代码如下
System.setOut( new PrintStream(
new BufferedOutputStream(
new FileOutputStream(
FileDescriptor.out
)
) , true)
);
System.out.println(str);
4.既然System.out 可以这样玩,那么 Sytem,in 可不可以呢,System.in 就是 System的一个静态成员,InputStream的实例,所以答案肯定是能的。
System.in 的从文件输入
代码如下
public static void printFormFile(String path) throws IOException {
InputStream is = System.in;
is = new BufferedInputStream(
new FileInputStream(
new File(path)
)
);
Scanner scanner = new Scanner(is);
System.out.println(scanner.nextLine());
scanner.close();
is.close();
}
5.System.in 的键盘输出
代码如下:
public static void printForKeybord() throws Exception {
InputStream in = System.in;
// 此处使用 BufferedReader 因为有新加的方法 readLine() 方便操作
BufferedReader br = new BufferedReader(
new InputStreamReader(in)
);
System.out.println("请输入!");
String readLine = br.readLine();
System.out.println( readLine );
}
效果如图:
!!!是不是似曾相识??? 是不是想起来一个叫 Scanner 的类,其实也就那么回事,是吧,也就是个跟 InputStram ,Reader差不多的东西,
所以,我们上面的 那里从文件读取数据输出到控制台使用 Scanner 的地方也可以这样修改:
public static void printFormFile(String path) throws IOException {
InputStream is = System.in;
is = new BufferedInputStream(
new FileInputStream(
new File(path)
)
);
//Scanner scanner = new Scanner(is);
BufferedReader br = new BufferedReader(
new InputStreamReader(is)
);
String len = null;
while( null != (len = br.readLine()) ) {
System.out.println( len );
}
is.close();
}