- 浏览: 253815 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
探索者_技术:
不错 讲解的比较详细
Java 执行过程详解 - JVM 生命周期 -
besterzhao:
学习了
关于 sun.misc.Unsafe -
lliiqiang:
属性变量被设定为不可更改的,外界传递的对象复制一份再保存到对象 ...
不可变类(immutable class) -
xunke515:
有启发.感谢
Java System 类详解 - in, out, err -
bo_hai:
你说没错。问题是:怎么样把ClassA中的事务传播到Class ...
Spring 事务在多线程环境下的传播
java.lang.System类应该说是JDK提供的一个很好的工具类。这个类设计成final,就是不让你继承。不提供构造函数,就是说不让你实例化。它却给我们提供了很多有用的方法和属性。
System 类提供了标准输入(in),输出(out)和错误(err)流。
什么是标准输入输出流?这是一个Unix概念,用来表示被程序使用的单个的信息流。还不不明白。还有什么不标准的吗?哈哈。其实我看了wiki上的解释后认为翻译成默认的流更好。停下来想一想。当你想在你的程序里面输出一个字符串的时候,操作系统怎么知道你要输出到哪里去呢?现在你当然会想当然的认为输出到显示器上啊。那时你习惯了。其实很久以前的操作系统中,在你准备输出之前,你要先连接好输出设备,是不是很麻烦。所以OS后来就预先为你连接了一个设备用于你的输入输出,通常都是控制台了。这样你就不用连接就可以用了。所以我认为理解成默认的更好。当然既然大家都认为它是默认的,那他不就是标准的了?
还有一个问题,既然都是输出,为什么还分out和err。这个问题好!要知道,系统既然可以默认,程序就能修改,也就是从定向。就是说通过设置,让System.out把信息输出到你想要的地方,比如文件,也就成了日志文件。你想想,一般的信息和错误信息能同等对待吗?那必须得分开啊。比如你可以把一般的信息和错误信息打印到不同的文件里面,你就可以很快找到错误信息,而不至于被淹没在大量的一般信息里面。这就是为什么你的系统日志分一般日志和错误日志。
还有一个区别是,out是缓存输出的,err是不缓存的,因为它紧急嘛。刻不容缓。呵呵。
这里注意是字节流,out和err都是java.io.PrintStream,继承了java.io.OutputStream。
而err是InputStream。关于字节流和字符流以后再说,这里不展开。
你用的最多的应该就是System.out这个静态属性了。利用这个标准输出流对象,你可以把字符串打印到控制台。
然而,他还有连个姐妹,System.in和System.err。System.err也可以让你把字符串打印到控制台,不同的是它打印出来的是红色的字体。
Hello System.out!
Hello System.err!
log4j 的实现ConsoleAppender中就是用了System.out和System.err来输出日志到控制台上:
System.in与out相反,当然就是接收你从控制台的输入。当你做一个交互性程序的时候就会用到了。这个类比较有意思,我们多说一点。先看看怎么用它读一个整数:
System.in.read()会从标准输入流中读出下一个字节,如果你用System.out打印出来,应该是整数的asc码,而不是你想要的整数。为什么呢?看看他们的类型就知道,out和err是PrintStream,而in则是InputStream,那么初始化的时候具体是什么对象给了in呢?下面是System的片段:
我们得停下来想一下。读和写看起来是对称的,但他们的行为方式并不是那么对称,尤其是从API角度看。
PrintStream,本身是一个字节流,这个类专门把字符流按照平台的编码算法转化成字节流输出来。他做了一个编码转换的工作,既然牵涉到了字符流和字节流之间的转换,就少不了用
OutputStreamWriter。最终的打印工作就是由他的方法完成:
从上面的过程来看,标准输出的意图是明确的。但是他却不知道你要输入什么,他开了个窗户,你要填进来什么他并不知道。他更不知道你要以什么格式获取,你可能想得到字节数组,可能想得到字符串。可能想得到整数。所以需要你自己来包装这个in。
再来了解一下Console,其实控制台是一个字符输入设备。所以在没有任何包装的情况下,你输入的整数会被看做是字符,它自然给吧asc码打印出来。
其实不管是输入还是输出你都得用buffer,以来io设备慢于内存速度很多,而来在你对字符和字节转化的时候他们的个数已不是一对一的。也就是说你可能需要几个字节才能生产出一个字符。同理,一个字符你需要几个字节来保存。
input:1234567
output String: 12342
output int: 1236
从上面的输出你可以看出,in是从Console读到了一串字符,填充到buff里面,注意哦,因为buff只有4个字节大小,你知道一个字节就可以表示一个字符,所以只是接收到了前四个字符。利用这个字节数组你就可以构建你想要的数据类型,但是先要构建一个字符串。然后你就可以进而转化成其他类型的数据了。
其实现实中不用这么麻烦,因为jdk已经给我们提供了很多基于字符的Reader类,你可以利用这些类包装成你想要的格式。不过注意,因为in是字节流,那么要包装成字符流自然要用到那个桥,InputStreamReader:
既然提到了控制台,就顺便说一下Console。从jdk1.6开始提供了java.io.Console。利用这个类可以方便的从Console读写。System提供了方法可以获取这个对象:
需要注意的是,Console 是指没有从定向过的控制台,一般是OS的命令行。如果在IDE比如eclipse中运行,会得到空指针异常,那是因为IDE把标准IO从定向到自己的IDE里面去了。Console还提供了console.readPassword()方法,这样当你在Console输入的时候没有回显,这样在输入密码的时候就安全了哦。
顺着再说一下从定向
Java System类允许你根须需要把标准IO从定向。他提供了方法:
下面的代码就是让你把字符串写到日志文件里面去:
System 类提供了load文件和库的方法。
当你用到native方法,也就是你写了一些本地方法的时候,你可能需要用这个方法load你的dll。
更新中...
System 类提供了标准输入(in),输出(out)和错误(err)流。
什么是标准输入输出流?这是一个Unix概念,用来表示被程序使用的单个的信息流。还不不明白。还有什么不标准的吗?哈哈。其实我看了wiki上的解释后认为翻译成默认的流更好。停下来想一想。当你想在你的程序里面输出一个字符串的时候,操作系统怎么知道你要输出到哪里去呢?现在你当然会想当然的认为输出到显示器上啊。那时你习惯了。其实很久以前的操作系统中,在你准备输出之前,你要先连接好输出设备,是不是很麻烦。所以OS后来就预先为你连接了一个设备用于你的输入输出,通常都是控制台了。这样你就不用连接就可以用了。所以我认为理解成默认的更好。当然既然大家都认为它是默认的,那他不就是标准的了?
还有一个问题,既然都是输出,为什么还分out和err。这个问题好!要知道,系统既然可以默认,程序就能修改,也就是从定向。就是说通过设置,让System.out把信息输出到你想要的地方,比如文件,也就成了日志文件。你想想,一般的信息和错误信息能同等对待吗?那必须得分开啊。比如你可以把一般的信息和错误信息打印到不同的文件里面,你就可以很快找到错误信息,而不至于被淹没在大量的一般信息里面。这就是为什么你的系统日志分一般日志和错误日志。
还有一个区别是,out是缓存输出的,err是不缓存的,因为它紧急嘛。刻不容缓。呵呵。
这里注意是字节流,out和err都是java.io.PrintStream,继承了java.io.OutputStream。
而err是InputStream。关于字节流和字符流以后再说,这里不展开。
你用的最多的应该就是System.out这个静态属性了。利用这个标准输出流对象,你可以把字符串打印到控制台。
public static void main(String[] args) { System.out.println("Hello System.out!"); System.err.println("Hello System.err!"); }
然而,他还有连个姐妹,System.in和System.err。System.err也可以让你把字符串打印到控制台,不同的是它打印出来的是红色的字体。
引用
Hello System.out!
Hello System.err!
log4j 的实现ConsoleAppender中就是用了System.out和System.err来输出日志到控制台上:
public class ConsoleAppender extends WriterAppender { private static class SystemOutStream extends OutputStream { ... public void flush() { System.out.flush(); } public void write(final byte[] b) throws IOException { System.out.write(b); } } private static class SystemErrStream extends OutputStream { ... public void flush() { System.err.flush(); } public void write(final byte[] b) throws IOException { System.err.write(b); } } ... }
System.in与out相反,当然就是接收你从控制台的输入。当你做一个交互性程序的时候就会用到了。这个类比较有意思,我们多说一点。先看看怎么用它读一个整数:
try { int input = System.in.read(); System.out.println("read int: " + input); } catch (IOException e) { e.printStackTrace(); }
System.in.read()会从标准输入流中读出下一个字节,如果你用System.out打印出来,应该是整数的asc码,而不是你想要的整数。为什么呢?看看他们的类型就知道,out和err是PrintStream,而in则是InputStream,那么初始化的时候具体是什么对象给了in呢?下面是System的片段:
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)); }
我们得停下来想一下。读和写看起来是对称的,但他们的行为方式并不是那么对称,尤其是从API角度看。
PrintStream,本身是一个字节流,这个类专门把字符流按照平台的编码算法转化成字节流输出来。他做了一个编码转换的工作,既然牵涉到了字符流和字节流之间的转换,就少不了用
OutputStreamWriter。最终的打印工作就是由他的方法完成:
private final StreamEncoder se; public void write(char cbuf[], int off, int len) throws IOException { se.write(cbuf, off, len); }
从上面的过程来看,标准输出的意图是明确的。但是他却不知道你要输入什么,他开了个窗户,你要填进来什么他并不知道。他更不知道你要以什么格式获取,你可能想得到字节数组,可能想得到字符串。可能想得到整数。所以需要你自己来包装这个in。
再来了解一下Console,其实控制台是一个字符输入设备。所以在没有任何包装的情况下,你输入的整数会被看做是字符,它自然给吧asc码打印出来。
其实不管是输入还是输出你都得用buffer,以来io设备慢于内存速度很多,而来在你对字符和字节转化的时候他们的个数已不是一对一的。也就是说你可能需要几个字节才能生产出一个字符。同理,一个字符你需要几个字节来保存。
byte[] buff = new byte[4]; System.out.print("input:"); System.in.read(buff); String s = new String(buff); System.out.println("output String: " + (s+2)); int i = Integer.valueOf(s); System.out.println("output int: " + (i+2));
引用
input:1234567
output String: 12342
output int: 1236
从上面的输出你可以看出,in是从Console读到了一串字符,填充到buff里面,注意哦,因为buff只有4个字节大小,你知道一个字节就可以表示一个字符,所以只是接收到了前四个字符。利用这个字节数组你就可以构建你想要的数据类型,但是先要构建一个字符串。然后你就可以进而转化成其他类型的数据了。
其实现实中不用这么麻烦,因为jdk已经给我们提供了很多基于字符的Reader类,你可以利用这些类包装成你想要的格式。不过注意,因为in是字节流,那么要包装成字符流自然要用到那个桥,InputStreamReader:
InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); String line = br.readLine(); System.out.print(line);
既然提到了控制台,就顺便说一下Console。从jdk1.6开始提供了java.io.Console。利用这个类可以方便的从Console读写。System提供了方法可以获取这个对象:
Console console = System.console(); String line = console.readLine(); System.out.print(line);
需要注意的是,Console 是指没有从定向过的控制台,一般是OS的命令行。如果在IDE比如eclipse中运行,会得到空指针异常,那是因为IDE把标准IO从定向到自己的IDE里面去了。Console还提供了console.readPassword()方法,这样当你在Console输入的时候没有回显,这样在输入密码的时候就安全了哦。
顺着再说一下从定向
Java System类允许你根须需要把标准IO从定向。他提供了方法:
public static void setIn(InputStream in); public static void setOut(PrintStream out); public static void setErr(PrintStream err);
下面的代码就是让你把字符串写到日志文件里面去:
FileOutputStream fos = new FileOutputStream("d:\\system.out.log"); PrintStream out = new PrintStream(fos); System.setOut(out); System.out.println("Hello new out");
System 类提供了load文件和库的方法。
当你用到native方法,也就是你写了一些本地方法的时候,你可能需要用这个方法load你的dll。
更新中...
发表评论
-
Spring 源码学习 - ClassPathXmlApplicationContext
2012-05-06 11:47 6770众所周知,Spring以其强大而又灵活的IoC管理功能著称。I ... -
从appfuse开始学习Spring和Hibernate - (2)Spring启动log
2012-05-05 21:35 2422分析appfuse的详细的启动日志来看看Spring的启动过程 ... -
从appfuse开始学习Spring和Hibernate - (1)构建项目
2012-05-05 15:54 6430千里之行,始于足下。结合例子学习概念,比较靠谱。本文介绍如何开 ... -
Spring 事务在多线程环境下的传播
2012-05-04 21:42 8876有时候需要使用多线程来提高对于CPU,尤其是多核CPU的利用率 ... -
关于Hashtable和HashMap, Vector和ArrayList
2012-05-01 09:41 1947在功能上讲Hashtable和HashMap, Vector和 ... -
JVisualVM还真是不错
2012-04-27 21:38 1689最近再看Java 性能的问题。一直都习惯使用Jconsole和 ... -
Java String 详解 - String Literal
2012-04-08 14:23 2408为了性能和内存资源上 ... -
Java Management Extensions (JMX) 学习笔记- 程序管理和监控
2012-04-07 20:25 4283在学习Tomcat 7 的源代码的时候发现,大量运用到了JMX ... -
Tomcat 7 源码分析 - 初始化 class loader
2012-04-07 19:24 2430Bootstrap 在启动的时候初 ... -
Tomcat 7 源码分析 - 启动概览 bootstrap
2012-04-07 14:57 2384先大致浏览一下整个启 ... -
Tomcat 7 源码分析 - 下载 tomcat source code 并导入eclipse
2012-04-07 09:23 17486准备好好研究学习一下tomcat 7 的源代码,那么第一步就是 ... -
Java Generic 学习
2012-04-06 19:34 1586泛型是Java 5开始引入的一个语言级别的特性 ... -
Java 执行过程详解 - JVM 生命周期
2012-04-04 12:01 8703Java的执行过程也就是JVM从启动到退出的过程。JVM的运行 ... -
Java System 类详解 - properties and environment variables
2012-04-04 11:32 2514在环境配置中我们经常需要知道或者设置系统属性值和环境变量。系统 ... -
Java System 类详解 - arraycopy
2012-04-04 11:01 2537System类提供了数组copy函数: public ... -
Java System 类详解 - in, out, err
2012-04-04 07:46 10511几乎所有的都用过这个System类吧,因为大家学习的第一个语句 ... -
关于 sun.misc.Unsafe
2012-04-03 15:31 4670今天在看java.util.concurrent.atomic ... -
如何提高代码质量
2012-04-02 20:08 1188本文是写给开 ... -
在Java中什么是 Primitive 和 Reference 类型
2012-03-24 23:14 2889Java虽然是个面向对象的语言,也声称“Everything ... -
Java 并发编程 - Programming Concurrency on the JVM
2012-03-24 23:08 3519这几个月一直在做性能调优的工作,以前总是进行功能的开发,从来不 ...
相关推荐
maven-resources-production java.lang.NegativeArraySizeException java.lang.NegativeArraySizeException 问题解决
2. 手动回收垃圾:可以使用 `System.gc()` 方法来手动回收垃圾。 3. 及时释放资源:及时释放内存、数据库连接等资源,以避免内存泄露。 其他解决方法 1. 使用 Java 提供的垃圾回收机制:Java 提供了多种垃圾回收...
2. 使用`java.lang.ClassLoader.loadLibrary()`代替`System.loadLibrary()`,这样可以提供更精确的库文件路径。 3. 检查是否有其他依赖库冲突,有时多个库可能使用相同的名字,导致加载混乱。 最后,博客链接...
在Java编程中,`java.lang.NumberFormatException`是一个常见的运行时异常,它通常发生在尝试将一个字符串转换为数值类型(如int、long、float或double)时,但该字符串无法被解析为有效的数值。"For input string: ...
1. 避免无谓的System.gc()调用,让JVM自行决定最佳的垃圾回收时机。 2. 调整堆大小,确保有足够的空间容纳程序运行所需的对象。 3. 使用对象池来复用对象,减少新对象的创建。 4. 使用合适的对象类型,避免创建不必...
`java.lang`包中最基本的类是`Object`,它是所有类层次结构的根,而`Class`类的实例则代表运行时的类。 `java.lang`包包括以下关键类: 1. **Boolean**: 表示布尔值`true`和`false`。 2. **Long, Short, Byte, ...
System.out.println("result is:" + result); LIST_A.add("haha"); return sps; } public static StaticParamsSingle getInstance() { return sps; } private static int getA() { System.out.println(...
在`java.lang.System`类中,有如`System.out`、`System.in`和`System.err`这样的全局变量,它们分别代表了标准输出、标准输入和标准错误流。在常规的测试环境中,这些流的输出很难捕获和控制。然而,使用`system-...
Java中的`java.lang.System`类是Java核心库中不可或缺的一部分,它是系统级操作的主要入口点。这个类提供了很多静态字段和方法,用于处理系统级别的任务,如输入输出流管理、系统属性获取、时间戳获取以及资源加载等...
system-rules, 用于测试使用 java.lang.System的代码的JUnit规则的Collection 系统规则 系统规则是用于测试使用 java.lang.System的代码的JUnit规则的Collection 。安装系统规则可以从 Maven 中心使用。<dependency>...
Java语言的核心库之一就是`java.lang`包,它包含了Java程序设计中最基础的类和接口,这些类和接口是每个Java应用程序必不可少的。由于`java.lang`包在编译时自动导入,因此程序员无需显式引入。本章将详细探讨这个...
在Android开发过程中,有时会遇到一个常见的运行时异常——`java.lang.NoClassDefFoundError`。这个错误通常意味着在编译期间能够找到类的定义,但在运行时却无法加载该类。本文将深入探讨这个问题,特别是在Android...
《java_lang包详解》 Java语言的核心库之一就是java.lang包,它包含了Java程序中最基础、最...在编写Java程序时,无论何时何地,你都有可能需要用到java.lang包中的类和接口,因此深入学习和掌握这个包是至关重要的。
3. **System类**:`System`类提供了一些与系统环境相关的属性和方法,例如`System.out.println()`用于输出信息到标准输出流,`System.exit()`用来终止当前Java虚拟机。 4. **Math类**:包含了一些数学运算常量和...
08-13 18:29:22.924: E/AndroidRuntime(1875): Caused by: Java.lang.ClassNotFoundException:XXXXX in loader dalvik.system.PathClassLoader[/data/app/XXXX.apk] 我想大家经常因为疏忽出现...
`java.lang.ExceptionInInitializerError` 是Java编程语言中一个特殊的运行时异常,它通常表示在类的静态初始化过程中发生了异常。这个错误不是因为类的构造函数,而是由于静态变量初始化或者静态初始化块(也称为...
在Java编程中,`java.lang.NoSuchFieldException`是运行时异常的一种,通常发生在尝试访问或操作一个类的字段,但该字段在指定的类或其任何超类中不存在时。这个异常表明在编译期间可能存在的字段在运行时无法找到,...
05-27 15:35:11.487 E/AndroidRuntime( 2352): Process: com.android.systemui, PID: 2352 05-27 15:35:11.487 E/AndroidRuntime( 2352): java.lang.RuntimeException: Unable to create service ...
当我们遇到“java.lang.ClassNotFoundException: org.aspectj.lang.annotation.Around”这样的错误时,通常意味着在我们的项目中缺少了AspectJ库,这是Spring AOP实现的关键组成部分。 AspectJ是一个全面且成熟的...