`
JackyCheng2007
  • 浏览: 252462 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java System 类详解 - in, out, err

    博客分类:
  • Java
阅读更多
几乎所有的都用过这个System类吧,因为大家学习的第一个语句大概就是

package jdk.lang;

public class SystemInspection {
	public static void main(String[] args) throws Exception {
		System.out.println(“Hello World”);
	}
}

本文将一一详解这个类的标准输入(in),输出(out)和错误流(err)使用和原理。先看一个更复杂的例子:
package jdk.lang;

public class SystemIOE {
	public static void main(String[] args) throws Exception {
		System.out.println("Hello Out");
		System.err.println("Hello Error");
		byte[] b = new byte[1024];
		int count = System.in.read(b);
		System.out.println(new String(b, 0, count));
	}
}


在eclipse上运行,输出:

Hello Out
Hello Error
Hello In 
Hello In

分析:

其实out, in 和 err是它的静态属性:
public final static InputStream in = nullInputStream();
public final static PrintStream out = nullPrintStream();
public final static PrintStream err = nullPrintStream();


他们其实是在private static void initializeSystemClass()中初始化的:
FileInputStream fdIn = new FileInputStream(FileDescriptor.in);
	FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
	FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err);
	setIn0(new BufferedInputStream(fdIn));
	setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true));
	setErr0(new PrintStream(new BufferedOutputStream(fdErr, 128), true));


FileDescriptor.out,FileDescriptor.in和FileDescriptor.err其实是
public static final FileDescriptor in = standardStream(0);
public static final FileDescriptor out = standardStream(1);
public static final FileDescriptor err = standardStream(2);

再往下就是native的调用了。
同时System类还提供方法让你设置in,out和err,这样你就可以实现自己的日志系统了。运行下面的代码:
package jdk.lang;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;

public class SystemIOE {
	public static void main(String[] args) throws Exception {
		redirect();
		helloIO();
	}

	private static void helloIO() throws IOException {
		System.out.println("Hello Out");
		System.err.println("Hello Error");
		byte[] b = new byte[1024];
		int count = System.in.read(b);
		System.out.println(new String(b, 0, count));
	}

	public static void redirect() throws FileNotFoundException {
		InputStream in = new BufferedInputStream(new FileInputStream(new File(
				"c:/in.txt")));
		System.setIn(in);
		PrintStream out = new PrintStream(new FileOutputStream(new File(
				"c:/out.log")));
		System.setOut(out);
		PrintStream err = new PrintStream(new FileOutputStream(new File(
				"c:/err.log")));
		System.setErr(err);
	}
}



后面我再看看logback的实现是不是用到了这个类。待续。。。






0
0
分享到:
评论
1 楼 xunke515 2014-08-30  
有启发.感谢

相关推荐

    java基础(System.err和System.out)详解

    "Java基础(System.err和System.out)详解" Java基础中的System.err和System.out是两个非常重要的输出流,它们都是输出流,但它们有着不同的用途和特点。下面我们将详细介绍这两个输出流的概念、区别和使用注意事项...

    Java System类详解_动力节点Java学院整理

    Java的System类是Java开发工具集(JDK)提供的重要工具类,主要用于处理与系统相关的操作。由于它被声明为final,所以无法被其他类继承。System类的主要功能包括: 1. **标准输入输出**: - `System.in`:表示标准...

    mysql-connector-java-5.1.10-bin.jar

    《MySQL数据库连接器Java驱动详解——mysql-connector-java-5.1.10-bin.jar》 MySQL数据库在软件开发中占据着重要的地位,而与之交互的Java应用程序通常依赖于`mysql-connector-java`这个数据库驱动。本文将深入...

    JAVA-ERR

    ### Java常见错误整理——空指针异常详解 #### 引言 在Java开发过程中,空指针异常(`NullPointerException`)是最常见的运行时异常之一。本文将深入探讨空指针异常的原因及其解决策略,帮助开发者更好地理解和避免...

    java反射规范--java资源

    ### Java反射规范详解 #### 一、Java反射概述 反射(Reflection)是Java语言的一项重要特性,它使得Java程序能够动态地检查和修改自身结构与行为。反射的主要用途包括但不限于:获取类的信息(如类名、方法名、...

    java的反射 发射详解

    ### Java的反射机制详解 #### 一、反射的概念与历史 反射的概念最早由Smith在1982年提出,指的是程序有能力访问、检测并修改其自身的状态或行为。这一概念一经提出便引起了计算机科学界的广泛关注,并迅速应用于多...

    Log4j将System.out搞到log4j中输出四

    《Log4j将System.out重定向到Log4j输出详解》 在日志管理中,Log4j是一款广泛使用的开源日志框架,它允许开发者灵活地控制日志信息的输出方式和级别。当我们习惯于使用`System.out.println()`进行调试时,如何将...

    commons-io-1.4.jar.zip_io流jar

    Java标准库提供了许多预定义的流类,如FileInputStream/FilOutputStream用于文件操作,System.in/out/err是标准输入/输出/错误流,SocketInputStream/SocketOutputStream用于网络通信。 Apache Commons IO库是一个...

    java学习笔记之Java-IO操作共19页.pdf.zi

    【Java IO操作详解】 在Java编程中,IO(Input/Output)操作是处理数据输入与输出的核心技术。Java-IO操作共19页的笔记详细介绍了这一关键领域,旨在帮助开发者掌握如何有效地读取、写入和管理数据。Java IO API...

    JAVA存储过程详解

    ### JAVA存储过程详解 在Java开发中,存储过程是一种预编译并存储在数据库中的SQL脚本或程序,它可以接收参数、执行复杂的逻辑,并返回结果。利用Java来调用存储过程,可以极大地提高应用程序的性能和安全性。下面...

    北大Java--IO

    【北大Java--IO】知识点详解 输入/输出处理在计算机编程中扮演着至关重要的角色,尤其是在Java编程语言中。Java的I/O(输入/输出)流系统为各种类型的输入源和输出目标提供了一种统一的处理方式,简化了程序设计。...

    java输入输出语句.doc

    ### Java 输入输出语句详解 #### 一、概述 Java 中的输入输出操作主要通过流(Streams)来完成。流可以分为输入流和输出流两大类。Java 提供了多种预定义的流对象来简化输入输出操作的过程。本文将详细介绍 Java ...

    java执行可执行文件,Runtime.exec、ProcessBuilder、commons-exec

    ### Java执行可执行文件的方法详解 在Java编程中,经常需要执行一些外部的可执行文件或者脚本(如bat或shell脚本)。本文将详细介绍三种常用的方法:`Runtime.exec()`、`ProcessBuilder`以及`commons-exec`库。 ##...

    java试题(非武大)

    - 标准流:System.in、System.out、System.err。 - 文件操作:FileInputStream、FileOutputStream、FileReader、FileWriter。 - 转换流:InputStreamReader、OutputStreamWriter。 - 缓冲流:BufferedReader、...

    Java中的IP地址和InetAddress类使用详解

    System.err.println("无法解析主机名: " + e.getMessage()); } } } 在Java编程中,了解和使用IP地址以及InetAddress类是非常基础且重要的。IP地址是互联网上每台设备的唯一标识,它由32位二进制数字组成,通常以...

    Java实用编程100例(1-50)

    8. **标准输入输出**(实例32):Java通过System类的in、out和err属性分别获取标准输入流、输出流和错误输出流。通过这些流,程序可以读取用户输入,或者向控制台输出信息。在处理命令行交互或管道输入输出时,这...

    java专题-反射

    ### Java反射机制详解 #### 引言 Java的反射机制是一种强大的编程工具,它使得Java程序能够在运行时检查和操作自身结构与行为的能力。这种能力不仅增强了Java的灵活性,也使其成为实现动态代理、框架搭建(如Spring...

Global site tag (gtag.js) - Google Analytics