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. review简历之感想和建议

    最近帮很多朋友review他们的简历,总结起来存在以下问题: 1,简历太多页了.请尽量不超过两页.一般地,每个hr阅读简历的时间大概在20s甚至更少,写那么多页不仅毫无必要,而且有害. 而且我怀疑一般 ...

  2. JPEG文件结构

    JPEG文件由八个部分组成,每个部分的标记字节为两个,首字节固定为:0xFF,当然,准许在其前面再填充多个0xFF,以最后一个为准.下面为各部分的名称和第二个标记字节的数值,用ultraedit的16 ...

  3. 体验 ASP.NET Core 1.1 中预编译 MVC Razor 视图

    这是从 ASP.NET Core 1.1 官方发布博文中学到的一招,可以在 dontet publish 时将 Razor 视图编译为 .dll 文件. 需要在 project.json 中添加如下配 ...

  4. ASP.NET MVC 防止 CSRF 的方法

    MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(CSRF:Cross-site request forgery)攻击的一个措施,它跟XSS(XSS又叫CSS:Cross ...

  5. 我心中的核心组件(可插拔的AOP)~大话开篇及目录

    回到占占推荐博客索引 核心组件 我心中的核心组件,核心组件就是我认为在项目中比较常用的功能,如日志,异常处理,消息,邮件,队列服务,调度,缓存,持久化,分布式文件存储,NoSQL存储,IoC容器,方法 ...

  6. WCF 安全性 之 Windows

    案例下载 http://download.csdn.net/detail/woxpp/4113172 服务端配置代码 <system.serviceModel> <services& ...

  7. int and string

    int转string一.#include <sstream> int n = 0; std::stringstream ss; std::string str; ss<<n; ...

  8. KnockoutJS 3.X API 第七章 其他技术(3) 延迟更新

    .example { display: inline-block; padding: 1em; margin-right: 2em; background: #F6F6EF; } 注意:本文档适用于K ...

  9. Box Model,边距折叠,内联和块标签,CSSReset

    一.盒子模型(Box Model) 1.1.宽度测试 1.2.溢出测试 1.3.box-sizing属性 1.4.利用CSS画图 二.边距折叠 2.1.概要 2.2.垂直方向外边距合并计算 三.内联与 ...

  10. C#需知--长度可变参数--Params

    Params用于参数的数量可变的情况下,即参数的个数是未知数. 使用Params需要知道以下几点: 1.如果函数传递的参数含有多个,使用Params标记的参数数组需要放在最后 图上显示的很明确,不需要 ...