System表示系统类,它有3个与 Java IO 有关的常量。

  • System.out——系统标准输出
  • System.in——系统标准输入
  • System.err——错误信息输出

System.out

System.outPrintStream 的对象,在 PrintStream 中定义了一些了的 print()println() 方法。

所以,常见的 System.out.print()System.out.println() 语句调用的实际上是 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();

             }

         }

     };

System.in

System.inInputStream 类型的对象,可以利用它完成从键盘读取数据的功能。

例 从键盘读取数据

import java.io.InputStream;

public class SystemInDemo {
    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(); // 关闭输入流
    }
};

运行结果

请输入内容:Good Bye
输入的内容为:Good

上述结果中,输入内容并没有被完整打印出来。

这是因为代码中限制了存储数据的 byte 数组的大小。

如果不知道要输入的数据的实际长度,如何处理呢?

例 不指定大小,从键盘读取数据

import java.io.InputStream;

public class SystemInDemo2 {
    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(); // 关闭输入流
    }
};

运行结果

请输入内容:To be or not to be, that's a question.
输入的内容为:To be or not to be, that's a question.

但是,如果输入的是中文,则会出现乱码,如下:

请输入内容:计算机软件
输入的内容为:?????ú?í??

这是因为汉字一个字符占两个字节,而数据却一个一个字节的方式读进来的,所以造成了乱码。

最好的输入方式是将全部输入数据暂时存放在一块内存中,然后一次性从内存中读取出数据。

这样,既不会造成乱码,也不受长度限制。要完成这样的操作可以使用 BufferedReader 类去完成。

System.err

System.err 表示的是错误信息输出,如果程序出现错误,则可以直接使用 System.err 进行输出。

例 打印错误信息

public class SystemErrDemo {
    public static void main(String args[]) {
        String str = null;
        try {
            System.out.println(Integer.parseInt(str)); // 转型
        } catch (Exception e) {
            System.err.println(e);
        }
    }
};

运行结果

java.lang.NumberFormatException: null

IO 重定向

System 类可以改变 System.in 的输入流来源以及 System.outSystem.err 两个输出流的输出位置。

import java.io.*;

public class RedirectDemo {
    public static void main(String[] args) throws IOException {
        PrintStream console = System.out;
        BufferedInputStream in = new BufferedInputStream(new FileInputStream("d:\\in.txt")); // 绑定输入文件
        PrintStream out = new PrintStream(new BufferedOutputStream(new FileOutputStream("d:\\out.txt"))); // 绑定输出文件         // 设置重定向
        System.setIn(in);
        System.setOut(out);
        System.setErr(out);         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s;
        while ((s = br.readLine()) != null) {
            System.out.println(s);
            out.close();
            System.setOut(console);
        }
    }
}

需要注意的是,I/O重定向操纵的是字节流,而不是字符流。

参考资料

Java 编程思想

Java 开发实战经典

[Java IO]04_系统标准IO的更多相关文章

  1. 【linux草鞋应用编程系列】_1_ 开篇_系统调用IO接口与标准IO接口

    最近学习linux系统下的应用编程,参考书籍是那本称为神书的<Unix环境高级编程>,个人感觉神书不是写给草鞋看的,而是 写给大神看的,如果没有一定的基础那么看这本书可能会感到有些头重脚轻 ...

  2. 【Java TCP/IP Socket】Java NIO Socket VS 标准IO Socket

    简介 Java  NIO从JDK1.4引入,它提供了与标准IO完全不同的工作方式. NIO包(java.nio.*)引入了四个关键的抽象数据类型,它们共同解决传统的I/O类中的一些问题.    1. ...

  3. 文件IO函数和标准IO库的区别

    摘自 http://blog.chinaunix.net/uid-26565142-id-3051729.html 1,文件IO函数,在Unix中,有如下5个:open,read,write,lsee ...

  4. 标准io与文件io

    A: 代码重复: 语句块1: while(判断) { 语句块2: 语句块1: } 上面可以改写为: while(1) { 语句块1: if(判断) break: 语句块2: } B: 标准IO和文件I ...

  5. linux标准io的copy

    ---恢复内容开始--- 1.linux标准io的copy #include<stdio.h> int main(int argc,char **argv) { if(argc<3) ...

  6. (九)errno和perror、标准IO

    3.1.6.文件读写的一些细节3.1.6.1.errno和perror(1)errno就是error number,意思就是错误号码.linux系统中对各种常见错误做了个编号,当函数执行错误时,函数会 ...

  7. 标准IO操作

    前言 本文介绍使用java进行简单的标准IO操作. 操作步骤 1. 定义一个Scanner对象 2. 调用该对象的input函数族 (参见下面代码) 3. input函数的返回结果即是获取到的输入 示 ...

  8. 18、标准IO库详解及实例

    标准IO库是由Dennis Ritchie于1975年左右编写的,它是Mike Lestbain写的可移植IO库的主要修改版本,2010年以后, 标准IO库几乎没有进行什么修改.标准IO库处理了很多细 ...

  9. 为什么需要标准IO缓冲?

    (转)标准I/O缓冲:全缓冲.行缓冲.无缓冲 标准I/O库提供缓冲的目的是尽可能地减少使用read和write调用的次数.它也对每个I/O流自动地进行缓冲管理,从而避免了应用程序需要考虑这一点所带来的 ...

随机推荐

  1. [转]Tesseract 3.02中文字库训练

    下载chi_sim.traindata字库下载tesseract-ocr-setup-3.02.02.exe 下载地址:http://code.google.com/p/tesseract-ocr/d ...

  2. MVC Castle依赖注入实现代码

    1.MVc 实现依赖注入 public class WindsorControllerFactory : DefaultControllerFactory { private readonly IKe ...

  3. JQuery中的dialog使用介绍

    初始化参数 对于 dialog 来说,首先需要进行初始化,在调用 dialog 函数的时候,如果没有传递参数,或者传递了一个对象,那么就表示在初始化一个对话框. 没有参数,表示按照默认的设置初始化对话 ...

  4. Mpale 在汽车底盘悬架系统公差分析应用

    汽车底盘的作用是接受发动机的动力,使车轮转动,并保证汽车按驾驶员的操纵正常行驶.底盘包括传动系统.行驶系统.转向系统和制动系统这四大部分,通常,这四大系统也简称为传动系.行驶系.转向系和制动系.悬架是 ...

  5. HDFS 异常处理与恢复

    在前面的文章 <HDFS DataNode 设计实现解析>中我们对文件操作进行了描述,但并未展开讲述其中涉及的异常错误处理与恢复机制.本文将深入探讨 HDFS 文件操作涉及的错误处理与恢复 ...

  6. Microsoft开源跨平台的序列化库——Bond

    上个月Microsoft开源了Bond,一个跨平台的模式化数据处理框架.Bond支持跨语言的序列化/反序列化,支持强大的泛型机制能够对数据进行有效地处理.该框架在Microsoft公司内部的高扩展服务 ...

  7. [.net 面向对象程序设计进阶] (26) 团队开发利器(五)分布式版本控制系统Git——图形化Git客户端工具TortoiseGit

    [.net 面向对象程序设计进阶] (26) 团队开发利器(五)分布式版本控制系统Git——图形化Git客户端工具TortoiseGit 读前必备: 接上篇: 分布式版本控制系统Git——使用GitS ...

  8. 【Java并发编程实战】-----“J.U.C”:ReentrantLock之一简介

    注:由于要介绍ReentrantLock的东西太多了,免得各位客官看累,所以分三篇博客来阐述.本篇博客介绍ReentrantLock基本内容,后两篇博客从源码级别分别阐述ReentrantLock的l ...

  9. 辛巴学院-Unity-剑英陪你零基础学c#系列(三)计算与类型

    辛巴学院:正大光明的不务正业. 中秋节快乐,每逢佳节倍思亲,尤其是那素未谋面的老婆,对吧,屌丝们.   今天我们来探索一下C#里面奇怪的计算,奇怪的类型. 奇怪的计算 当我刚刚接触计算机编程的时候,一 ...

  10. 关于新加坡IT薪酬

    很多朋友发邮件或留言问我关于新加坡IT薪酬的问题,由于前段时间比较忙,所以没有及时一一回复,在此表示抱歉. 新加坡IT薪酬范围大概如下(月薪,新加坡币对人民币为1:5): Junior Develop ...