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数组中,然后把数组输出。

  • 相关阅读:
    Leetcode Binary Tree Preorder Traversal
    Leetcode Minimum Depth of Binary Tree
    Leetcode 148. Sort List
    Leetcode 61. Rotate List
    Leetcode 86. Partition List
    Leetcode 21. Merge Two Sorted Lists
    Leetcode 143. Reorder List
    J2EE项目应用开发过程中的易错点
    JNDI初认识
    奔腾的代码
  • 原文地址:https://www.cnblogs.com/alsf/p/6854540.html
Copyright © 2011-2022 走看看