zoukankan      html  css  js  c++  java
  • java的IO操作:System类对IO的支持。

    目标:

    1,掌握SYStem对IO的三种支持:

    system.out

    system.in

    system.err

    2,掌握system.out及system.err的区别。

    3,掌握输入,输出重定向。

    System类的常量

    java给system类对IO有一定支持,预制了三个常量。

    PrintStream out,PrintStream err,InputStream in。

    使用static final 声明的变量是全局常量,只要是常量,所有单词字母必须全部大写。但是这里没有,是java历史遗留问题。

    System.out

    使用system.out输出就是将输出位置定义在显示器之中。

    FilloutputStream输出位置定义在文件里,而System.out定位在屏幕上。

    使用outputStream完成屏幕上输出。

    PrintStream就是OutputStream子类。

    package 类集;
    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() ;
            }
        }
    };

    输出结果:

    解读:

    OutputStream正常来说是OutputStream out=new OutputStream(F f);其中f指定了文件输出路径,但是这里直接给out赋值System.out实例,因为这个

    实例的输出对象是屏幕,所以out的输出路径就是屏幕。

    很明显,这是对象多态的体现,根据实现的子类的不同。完成的功能也不同

    注意:OutputStream的write方法的接收对象是byte[]数组。使用getBytes()转换成byte数组。以及关闭输出流。

    System.err

    错误的标准输出。如果程序出现错误,直接使用System.err打印输出即可。

    package 类集;
    public class SystemDemo01{
        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不也一样吗?

    err和out区别。

    两者都能打印错误信息,但是一般来讲,system.out是将信息显示给用户,而system.err是不希望用户看到,后台显示的。专门显示错误的。

    要想输出错误,最好不要使用system.out而直接使用system.err。

    system.in

    实际上是一个键盘的输入流,其本身是InputStream类型对象,那么可以利用此对象从磁盘读取数据信息

    InputStream是一个输入流,输入流肯定可以从指定位置读取,之前的FillInputStream,是从文件中读取,

    package 类集;
    import java.io.InputStream;
    
    public class SystemDemo01{
        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() ;    // 关闭输入流
        }
    };

    运行结果:

    解读:首先定义一个InputStream对象input,赋值为system.in,使之可以从键盘接收对象,然后开辟一个byte数组,用来接收输入的数据,

    input.read(数组),把输入的数据赋值给byte数组,最终返回输入的数组大小len,使用new String()方法,把byte数组转换成String类型输出。

    需要注意的是,new String(b,o,len),必须指定输出的头和尾,如果不指定的话,就可能把没有数据的地方输出,如,我定义了一个36空间的数组,输入后,输出结果如下:

    但是数据输入了,以上操作是否存在问题呢?

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

    问题2:byte数组长度是奇数的话,可能会出现中文字符乱码问题。因为一个中文字符占用两个字节。

    那么,如果不知道byte数组长度呢,是否可以完成输入要求? 

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

    package 类集;
    import java.io.InputStream;
    
    public class SystemDemo01{
        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=='
    '){    // 退出循环,输入回车表示输入完成
                    break ;
                }
                buf.append(c) ;    // 保存内容
            }
            System.out.println("输入的内容为:" + buf) ;
            input.close() ;    // 关闭输入流
        }
    }; 

    思路:

    定义一个StringBuffer类,用来接收保存字符串,对于每次输入字符,通过input.read()方法,读取一个字节,赋值给temp,当读取到回车键时候,temp的值为-1,

    然后temp转换成char类型,char类型后,就可以拼接给StringBuffer对象了。

    注意:因为回车也是一个字符,所以,如果获取的字符是回车的话,就退出循环,if(c==' ') break;

    但是,以上代码,输入中文的话就会报错

    要想实现以上功能,只能通过下一节的BufferReader类。

    输入输出重定向

    通过System类可以改变System.in的输入流来源,以及System.out和system.err两个输出流的输出位置。

    setOut实例:

    package 类集;
    import java.io.File ;
    import java.io.FileOutputStream ;
    import java.io.PrintStream ;
    public class SystemDemo01{
        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是希望用户看到的信息,一旦有错误,最好保存起来。

    package 类集;
    import java.io.File ;
    import java.io.FileOutputStream ;
    import java.io.PrintStream ;
    public class SystemDemo01{
        public static void main(String args[]) throws Exception{
            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) ;
            }
        }
    };

    注意System.setOut方法的位置,放在try catch中间,这样,当发生错误的时候才会改变输出重定向

    为System.err重定向。

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

    package 类集;
    import java.io.ByteArrayOutputStream;
    import java.io.PrintStream ;
    public class SystemDemo01{
        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的输出位置。因为这些信息不希望用户看见。

    System.in重定向

    默认情况下,system.in是指向屏幕的,也可通过setin方法,改变输入的位置,例如现在从文件中读取。

    package 类集;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;
    public class SystemDemo01{
        public static void main(String args[]) throws Exception{
                System.setIn(new FileInputStream("d:" + File.separator + "red.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() ;    // 关闭输入流
            }
        };

    这样就不用键盘输入了,直接从目标文件中读取数据,赋值给byte数组中,然后把数组输出。

  • 相关阅读:
    Servlet 06: jar包引入和web配置文件创建
    Servlet 05: Servlet生命周期方法
    Servlet 04: 什么是重定向
    Servlet 03: 通过xml配置文件配置servlet访问路径
    080 面向过程编程
    079 内置函数
    078 匿名函数
    077 递归
    076 生成器
    075 字典生成式
  • 原文地址:https://www.cnblogs.com/alsf/p/6854540.html
Copyright © 2011-2022 走看看