分享

System类、BufferedReader类

 英昌知识汇聚馆 2012-02-29
System类是一个系统类,是一个陪伴我们时间最长的一个类,例如 System.out.println();就是类中提供的操作。
1.取得计算时间
         使用此类可以取得计算的时间。例如:想知道一个程序执行时一共花了多少时间。
         .得到当前的时间: Public  static  long  currentTimeMills(); 看下面代码:
          package org.lxh.systemdemo;

public class SystemDemo01 {
    public static void main(String[] args) {
        long begin = System.currentTimeMillis(); // 取得当前时间
        String str = "";
        for (int i = 0; i < 10000; i++) {
            str += i; // 会产生大量的垃圾
        }
        long end = System.currentTimeMillis(); // 取得当前时间
        System.out.println(end - begin);// 取得计算的时间
    }
}

2.System与垃圾收集
    在System类中存在一个gc()方法。public  static  void gc();  
    调用此方法实际上就是调用了Runtime类中的gc()方法。
     如果一个对象不用的话,则就有可能进行垃圾回集。但是如果一个对象在被收集前需要做一些收尾工作。
     在Object类中存在一个方法,此方法在对象被回收前调用:protected  void  finalize()  throws  Throwable.看下面代码:
package org.lxh.systemdemo;

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String toString() {
        return "姓名:" + this.name + ",年龄:" + this.age;
    }

    public void finalize() throws Throwable {
        System.out.println("我被回收了,我完蛋了。。。(" + this + ")");
    }
}

public class SystemDemo02 {
    public static void main(String[] args) {
        Person per = new Person("张三", 99);
        per = null; // 取消引用
        System.gc();// 强制进行垃圾收集
    }
}
从一般的开发角度上看,很少说有专门的开发在对象回收前进行操作的,所以,此操作理解即可。
面试题:请说出final,finally,finalize的区别?
System对IO的支持
System类中存在三个常量:
 序号 常量 描述
 1 public static final PrintStream  out
 表示的是一个标准的输出,输出的位置是显示器
 2 public static final PrintStream  err
 表示错误,错误的输出
 3 public static final InputStream  in
 表示的是键盘的输入,标准输入
1.System.out是PrintStream类的实例,常用的方法就是向屏幕上打印信息。当然,如果使用System.out的话,也可以直接
为OutputStream类实例化。如下代码:

 package org.lxh.sytemiodemo;

import java.io.OutputStream;

public class SysteOutDemo {
    public static void main(String[] args) throws Exception {
        OutputStream out = System.out; // 此时具备了向屏幕输出的能力
        out.write("hello world".getBytes());// 输出内容
        out.close();
    }

}
2.System.err:表示的是错误输出。看下面代码:
package org.lxh.sytemiodemo;

public class SystemErrDemo {
    public static void main(String[] args) {
        try {
            Integer.parseInt("hello");
        } catch (Exception e) {
            System.out.println(e);
            System.err.println(e);
        }
    }
}
从代码本身观察不出任何本质问题,只有在eclipse下才会出现红色的字。实际上对于以上两个常量想区分区别,
  只能从概念上讲:
  System.out:一般的信息是愿意展示给用户看见的
  System.err:一般的信息是不愿意展示给用户看见的
  3.System.in实际上表示的就是一个键盘的输入,使用此操作可以完成键盘输入数据的功能。看下面代码:
package org.lxh.sytemiodemo;

import java.io.InputStream;

public class SystemInDemo01 {

    public static void main(String[] args) throws Exception {
        InputStream input = System.in; // 准备键盘输入数据
        byte b[] = new byte[20]; // 开辟空间接收内容
        System.out.print("请输入内容:");
        int len = input.read(b); // 接收内容
        System.out.println("输入的内容是:" + new String(b, 0, len));
    }
}
此时,已经实现了键盘输入功能。但此程序在使用时会存在长度限制。而且输入中文时,也会存在问题,那么,
此时就可以通过另一种方法,不指定大小,边读边判断是否结束。请看下面代码:
package org.lxh.sytemiodemo;

import java.io.InputStream;

public class SystemInDemo03 {

    public static void main(String[] args) throws Exception {
        InputStream input = System.in; // 准备键盘输入数据
        System.out.print("请输入内容:");
        int temp = 0; // 接收内容
        StringBuffer buf = new StringBuffer();
        while ((temp = input.read()) != -1) {
            char c = (char) temp; // 转型
            if (c == '\n') {// 判断是否是回车
                break;// 退出循环
            }
            buf.append(c);
        }
        System.out.println("输入的内容是:" + buf);
    }
}
此时,数据读取的时候没有长度限制了。但是在输入中文时,就无法正确地读取,因为每次读的是一个字节。
应该按照整体读取,那么要想完成更好的读取操作,则只能使用后续的BufferReader类来完成。
BufferReader类:
该类表示的是缓冲区读取,可以一次性的将内容全部读取出来。
BufferReader类的构造方法:BufferedReader(Reader in);
那么,如果想要使用BufferReader类接收键盘的输入内容的话,则此时就无法直接实例化了,
System.in属于InputStream类型的。
在java中,提供了两个专门的类。字节到字符流的转换:
InputStreamReader:表示将字节的输入流转换成字符流
OutputStreamWriter:表示将字符的输出流转换成字节的输出流
直接使用以上的类,就可以完成转换功能。使用public String readLine() throws IOException方法可以读取数据。该方法表示
一次性读取一行数据,而且一定要记住的是,如果返回的类容是String是最好操作的。
例如:
package org.lxh.bufferdemo;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class BufferedReaderDemo {

    public static void main(String[] args) throws Exception {
        BufferedReader buf = null;
        // 将字节输入流变为字符输入流放在字符流的缓冲区之中
        buf = new BufferedReader(new InputStreamReader(System.in));
        System.out.print("请输入内容:");
        String str = buf.readLine();
        System.out.println("输入的内容是:" + str);
    }
}
如果想要完成键盘的输入功能,使用以上的操作是最合适的。也是键盘输入数据的标准格式。
4.输出输入重定向
System.out、Sytem.err都有固定的输出目标,都是屏幕
System.in有固定输入目标,是键盘
但,在System类中提供了一系列的输出输入重定向方法 ,可以改变System.out、Sytem.err、System.in的输入输出位置。
System.out重定向:public static void setOut(PrintStream out)
Sytem.err重定向:public static void setErr(PrintStream err)
System.in重定向:public static void setIn(InputStream in)
范例:输出重定向
package org.lxh.sytemiodemo;

import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintStream;

public class RedirectSystemOutDemo {
    public static void main(String[] args) throws Exception {
        File file = new File("d:" + File.separator + "demo.txt");
        System.setOut(new PrintStream(new FileOutputStream(file)));
        System.out.println("hello world") ;
    }
}
范例:错误重定向
package org.lxh.sytemiodemo;

import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintStream;

public class RedirectSystemErrDemo {
    public static void main(String[] args) throws Exception {
        File file = new File("d:" + File.separator + "demo.txt");
        System.setErr(new PrintStream(new FileOutputStream(file)));
        System.err.println("hello world") ;
    }
}
提示:之前曾经说过System.err是不希望用户看到的,而System.out是希望用户看到的。所以在开发中,
不建议改变System.err的输出位置,而只建议修改System.out的输出位置。
package org.lxh.sytemiodemo;

import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintStream;

public class ErrDemo {
    public static void main(String[] args) throws Exception  {
        File file = new File("d:" + File.separator + "err.log");
        System.setOut(new PrintStream(new FileOutputStream(file)));
        try {
            Integer.parseInt("hello");
        } catch (Exception e) {
            System.out.println(e);
            System.err.println(e);
        }
    }
}
范例:输入重定向
package org.lxh.sytemiodemo;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

public class RedirectSystemInDemo {
    public static void main(String[] args) throws Exception {
        File file = new File("d:" + File.separator + "demo.txt");
        System.setIn(new FileInputStream(file));
        InputStream input = System.in;
        byte b[] = new byte[20]; // 开辟空间接收内容
        int len = input.read(b); // 接收内容
        System.out.println("内容是:" + new String(b, 0, len));
    }
}
一般,System.in的操作最好不要去修改。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多