System.out.write与System.out.println的区别

定义一整型变量,将其赋值为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没有刷新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值