Java IO _System 类对IO的支持

来源:互联网 发布:tensorflow 二次开发 编辑:程序博客网 时间:2024/05/17 03:40

1、掌握System 对IO的三种支持

System.out

System.err

System.in

2、掌握System.out 及System.err 的区别

3、掌握输入 、输出重定向

具体内容

在讲解JAVA 类库的时候曾经讲解过的System 类的使用。


 使用static final 关键字声明的变量是全局常量,只要是常量,则所有的单词字母必须全部大写,如果按照现在的操作标准:System.OUT -->System.out

1、System.out

使用System.out 输出的时候就是将输出的位置定义在了显示器之中。

FileoutputStream 是定位在文件里,而System.out 是定位在屏幕上。

使用OutputStream 完成屏幕上输出

PrintStream 就是OutputStream 的子类。

import java.io.OutputStream ;import java.io.IOException ;public class SystemDemo01{public static void main(String args[]){OutputStream out = System.out ;// 此时的输出流是向屏幕上输出try{out.write("hello world!!!".getBytes()) ;// 向屏幕上输出}catch(IOException e){e.printStackTrace() ;// 打印异常}try{out.close() ;// 关闭输出流}catch(IOException e){e.printStackTrace() ;}}};
很明显就是对象多态性的体现,根据实现的子类不同,完成功能也不同。
2.System.err

System.err 表示的是错误的标准输出,如果程序中出现了错误的往话,则直接使用System.err 进行打印输出即可。

public class SystemDemo02{public static void main(String args[]){String str = "hello" ;// 声明一个非数字的字符串try{System.out.println(Integer.parseInt(str)) ;// 转型}catch(Exception e){System.err.println(e) ;}}};
错误信息:

java.lang.NumberFormatException:For input string:"hello"

有些读者会说了,如果此时不使用System.err 而是System.out输出的结果不也一样吗?


以上的代码肯定可以使用System.out 输出。只能从概念上划分。

记住:System.out 是希望用户可以看见的,而System.err 是不希望用户可以看见的。

3、System.in

System.in实际上是一个键盘的输入流,其本身是InputStream 类型的对象,那么,此时就可以利用此方式完成从读取数据的功能。

InputStream 对应的是输入流,输入流的话肯定可以从指定位置上读取,之前使用的是FileInputStream 是从文件中读取的。

import java.io.InputStream ;public class SystemDemo04{public static void main(String args[]) throws Exception {// 所有异常抛出InputStream input = System.in ;// 从键盘接收数据byte b[] = new byte[5] ;// 开辟空间,接收数据System.out.print("请输入内容:") ;// 提示信息int len = input.read(b) ;// 接收数据System.out.println("输入的内容为:" + new String(b,0,len)) ;input.close() ;// 关闭输入流}};
所有数据输入进去了,但是以上的操作是否存在问题呢?

问题一:指定了输入数据的长度,如果现在输入的数据超过了长度范围,则只能输入部分的数据。

问题二:指定的byte 数组长度是奇数的话,则还有可以出现中文乱码问题。


只能通过判断标志们的方式完成。

import java.io.InputStream ;public class SystemDemo05{public static void main(String args[]) throws Exception {// 所有异常抛出InputStream input = System.in ;// 从键盘接收数据StringBuffer buf = new StringBuffer() ;// 使用StringBuffer接收数据System.out.print("请输入内容:") ;// 提示信息int temp = 0 ;// 接收内容while((temp=input.read())!=-1){char c = (char) temp ;// 将数据变为字符if(c=='\n'){// 退出循环,输入回车表示输入完成break ;}buf.append(c) ;// 保存内容}System.out.println("输入的内容为:" + buf) ;input.close() ;// 关闭输入流}};
此时,没有长度限制,愿意输入多少就输入多少,但是真的可以执行吗?

如果现在输入的是中文呢?


如果要想实现以上的功能,则只能通过下一间节的BufferReader 类完成。

4、输入、输出重定向


4、1 为System.out 输出重定向

使用setOut() 方法完成。

import java.io.File ;import java.io.FileOutputStream ;import java.io.PrintStream ;public class SystemDemo06{public static void main(String args[]) throws Exception {System.setOut(new PrintStream(new FileOutputStream("d:" + File.separator + "red.txt"))) ;// System.out输出重定向System.out.print("www.mldnjava.cn") ;// 输出时,不再向屏幕上输出System.out.println(",李兴华") ;}};
此时将输出的位置重定向,所以所有的内容都向指定的文件中打印。

实际上通过此操作就可以完成错误的重定向。

System.out  是希望用户看得到的信息,一旦有错误,最好保存起来。

import java.io.File ;import java.io.FileOutputStream ;import java.io.PrintStream ;public class SystemDemo07{public static void main(String args[]){String str = "hello" ;// 声明一个非数字的字符串try{System.out.println(Integer.parseInt(str)) ;// 转型}catch(Exception e){try{System.setOut(new PrintStream(new FileOutputStream("d:"+ File.separator + "err.log"))) ;// 输出重定向}catch(Exception e1){}System.out.println(e) ;}}};
4、2 为System.err 重定向

利用System.err 向屏幕上输出信息,此时,为了方便起见,使用内存操作流。

import java.io.ByteArrayOutputStream ;import java.io.PrintStream ;public class SystemDemo08{public static void main(String args[]) throws Exception{// 所有异常抛出ByteArrayOutputStream bos = null ;// 声明内存输出流bos = new ByteArrayOutputStream() ;// 实例化System.setErr(new PrintStream(bos)) ;// 输出重定向System.err.print("www.mldnjava.cn") ;// 错误输出,不再向屏幕上输出System.err.println("李兴华") ;// 向内存中输出System.out.println(bos) ;// 输出内存中的数据}};

建议:一般不建议读者去修改System.err 的输出位置,因为这样的信息都不太希望用户可以看见。

4、3 为System.in 重定向

默认情况下System.in 是指屏幕的键盘输入,也可以通过setIn()  方法,将其的输入流的位置改变,例如,现在从文件中读取。

import java.io.FileInputStream ;import java.io.InputStream ;import java.io.File ;public class SystemDemo09{public static void main(String args[]) throws Exception{// 所有异常抛出System.setIn(new FileInputStream("d:"+ File.separator + "demo.txt")) ;// 设置输入重定向InputStream input = System.in ;// 从文件中接收数据byte b[] = new byte[1024];// 开辟空间,接收数据int len = input.read(b) ;//接收System.out.println("输入的内容为:" + new String(b,0,len)) ;input.close() ;// 关闭输入流}};

对于重定向操作,基本上都在System.out 上使用,以把信息展现给用户观看。

总结:

三个常量的使用:

System.out 是希望用户可以看见的信息。错误信息是用黑颜色显示的

System.err  是不希望用户可以看见的信息。则在IDE中将以红色的文字显示错误的信息。

System.in  对就键盘输入

以上的三个常量的输入 、输出 都可以重定向,但是一般只建修改setOut 的重定向。

Systemin 读取的时候会出现中文乱码问题,则可以通过BufferedReader 完成读取功能。