定义一整型变量,将其赋值为65,使用System.out.write在控制台上输出,代码如下:
public class Try1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
char c='A';
System.out.write(c);
}
}
此时控制台看不到任何效果。
对上文代码进行改进:
public class Try1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
char c='A';
System.out.write(c);
System.out.write('\n');
}
}
此时控制台输出大写字母A。
而当我们在使用System.out.println(char c)进行输出时,控制台会输出大写字母A。
由此可见,两种输出方式不同。下文对两者的不同进行详述。
System.out是PrintStream类。System.out.println('A')这句实际上调用的PrintStream类的println(char c)方法,而println(char c)方法的源代码为:
public void println(char x)
{
synchronized(this)
{
print(x);
newLine();
}
}
>>println(char c)调用了print(char c)方法,print(char c)方法的源代码如下:
public void print(char c)
{
write(String.valueOf(c));
}
>>>> print(char c)方法调用了write(String s)方法, write(String s)方法的源代码如下:
private void write(String s)
{
try{
synchronized(this)
{
ensureOpen();
textOut.write(s);
textOut.flushBuffer();
charOut.flushBuffer();
if(autoFlush && (s.indexOf('\n')>=0))
out.flush();
}
}
catch(InterruptedIOException x){
Thread.currentThread().interrupt();
}
catch(IOException x){
trouble=true;
}
}
当字符串含有'\n'时会刷新out,out是OutStream的实例。
>>println(char c)方法还调用了newLine()方法,newLine()方法的源代码为:
private void newLine()
{
try{
synchronized(this){
ensureOpen();
textOut.newLine();
textOut.flushBuffer();
charOut.flushBuffer();
if(autoFlush)
out.flush();
}
}
catch(InterruptedIOException x){
Thread.currentThread().interrupt();
}
catch(IOException x){
trouble=true;
}
}
newLine()方法会刷新out。
System.out.write(c)调用的是PrintStream().write(int b)方法,write(int b)方法的源代码如下:
public void write(int b)
{
try{
synchronized(this){
ensureOpen();
out.write(b);
if((b=='\n') && autoFlush)
out.flush();
}
}
catch(InterruptedIOException x){
Thread.currentThread().interrupt();
}
catch(IOException x){
trouble=true;
}
}
看过源代码就知道两者的差异了:println(char c)不但会刷新out,而且还会同时刷新textOut和charOut,而write(int b)只有当b=='\n'时才刷新out。当代码中添加了System.out.write('\n'),输出的文本也就显示出来了,问题就在于之前out没有刷新。