Java拾贝第十二天——System类
System类的常量
常量 | 描述 |
---|---|
public final static InputStream in | 系统标准输入,一般是键盘 |
public final static PrintStream out | 系统标准输出,一般是显示器 |
public final static PrintStream err | 错误输出 |
可以看到out和err是PrintStream类型的,而in是InputStream类型
System类中3个常量不符合命名规范是Java历史发展的产物,也叫Java发展遗留问题
System.out
其实下述打印语句就是调用的PrintStream类的方法。
System.out.print();
System.out.println();
System.out.printf();
栗子:
public static void main(String[] args) {
PrintStream out = System.out;
try {
out.write("hello world!".getBytes());
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
程序运行结果:
hello world!
System.err
表示的是错误信息输出,如果程序出现错误,可以直接使用System.err。
栗子:
public static void main(String[] args) {
String s="hello";
try {
System.out.println(Integer.parseInt(s));
} catch (NumberFormatException e) {
System.out.println(e);
System.err.println(e);//在控制台上输出
}
}
程序运行结果:
System.in
实际上是键盘的输入流,可以利用System.in完成从键盘读取数据。
栗子:
public static void main(String[] args) {
InputStream in = System.in;
byte[] bytes = new byte[1024];
try {
int read = in.read(bytes);//将读取的内容载入bytes并返回内容长度
System.out.println("键盘输入的内容:"+new String(bytes,0,read));
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
程序运行结果:
asdasd12333333333333 //键盘的输入
键盘输入的内容:asdasd12333333333333
System类重定向输入/输出
在System类常量得知,一般输出标准是显示器,一般输入标准是键盘。
但是通过System类的重定向方法也可也改变System.in的输入源和System.out和System.err的输出位置
System类重定向方法如下:
方法 | 类型 | 描述 |
---|---|---|
public static void setIn(InputStream in) | 静态方法 | 重定向标准输入 |
public static void setOut(PrintStream out) | 静态方法 | 重定向标准输出流 |
public static void setErr(PrintStream err) | 静态方法 | 重定向错误输出 |
静态方法即意味着通过类名即可访问其方法。(实际上System的构造方法也是私有的无法实例化)
setIn(InputStream in)
重定向标准输入,从键盘读取更改至文件。
D:\IOtest\text.txt内:
hello
world!12.3true
撒旦静安寺点击
1111111111.99
false
外号:法外狂徒-张三 +年龄:26 +财产:999.990000 +性别:M
外号:法外狂徒-张三 +年龄:26 +财产:999.99 +性别:M
栗子:
public static void main(String[] args) {
File file = new File("D:" + File.separator + "IOtest" + File.separator + "text.txt");
try {
System.setIn(new FileInputStream(file));//重定向至文件
InputStream in = System.in;//然后调用System.in的输入流
byte[] bytes = new byte[1024];
int read = in.read(bytes);
System.out.println(new String(bytes,0,read));
} catch (Exception e) {
e.printStackTrace();
}
}
程序运行结果:
hello
world!12.3true
撒旦静安寺点击
1111111111.99
false
外号:法外狂徒-张三 +年龄:26 +财产:999.990000 +性别:M
外号:法外狂徒-张三 +年龄:26 +财产:999.99 +性别:M
setOut(PrintStream out)
重定向标准输出,从输出到屏幕更改至文件。
D:\IOtest\text.txt内:
hello
world!12.3true
撒旦静安寺点击
1111111111.99
false
外号:法外狂徒-张三 +年龄:26 +财产:999.990000 +性别:M
外号:法外狂徒-张三 +年龄:26 +财产:999.99 +性别:M
栗子:
public static void main(String[] args) {
File file = new File("D:" + File.separator + "IOtest" + File.separator + "text.txt");
try {
System.setOut(new PrintStream(new FileOutputStream(file, true), true));
System.out.println();//先输出换行符
System.out.println("asdjiasi 阿斯近代史低价");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
程序运行后,D:\IOtest\text.txt内:
hello
world!12.3true
撒旦静安寺点击
1111111111.99
false
外号:法外狂徒-张三 +年龄:26 +财产:999.990000 +性别:M
外号:法外狂徒-张三 +年龄:26 +财产:999.99 +性别:M
asdjiasi 阿斯近代史低价
setErr(PrintStream err)
重定向错误输出,从输出屏幕更改到文件。
栗子:
public static void main(String[] args) {
File file = new File("D:" + File.separator + "IOtest" + File.separator + "text.txt");
String s="hello";
try {
System.setErr(new PrintStream(file));
Integer.parseInt(s);
} catch (Exception e) {
e.printStackTrace();
}
}
D:\IOtest\text.txt内:
java.lang.NumberFormatException: For input string: "hello"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at moudle2.Test12.main(Test12.java:12)
没追加,直接覆盖