看到網上有人討論Java如何?對控制台清屏,看到的內容不是很理想。所以把這些內容總結一下。
直觀一點,先看下代碼吧
import static java.lang.System.out;
/**
* Build by netbeans
* @author Felix Wu
*/
public class ConsleRewriteTest {
public static void main(String[] agrs) {
out.print( "aaaaaaaaaaaaaaaaaaaaaaaaaaaaa" );
pause();
out.print( "/r" + " " );
int total = 100;
for( int i=1; i<total; i++ ) {
pause();
out.print( "/r" + i + "/"+total );
}
}
private static void pause() {
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
//Swallow this exception
}
}
}
嚴格上說控制台是Java進程的輸出裝置。在Java中對應System.out流,對這個流而言你只能向其中輸入內容。那麼Java程式怎麼和他控制台通訊呢?
方式一:通過ASCII碼的控制字元'/r'.
'/r'表示斷行符號,就回到行首。'/n'表示換行,即移到下一行(游標垂直下移,如果游標在原行的第n個字元位置,那麼就下移到下一行的第n個字元位置)。那麼"/r/n"表示斷行符號換行,即移到下一行的行首。
注意上面對'/r'和'/n'的解釋是ASCII碼標準含義。但是不同的軟體對'/n'解釋不盡相同。比如按照ASCII碼的標準解釋斷行符號換行是"/r/n",而UNIX為了節約儲存空間,其API在儲存採用ASCII編碼的文本時用'/n'替代"/r/n",相應的在讀取顯示時'/n'效果等效於"/r/n"。簡而言之,在UNIX的API中'/n'的意思是斷行符號換行("/r/n")而不是標準的換行。JVM也採用了這個風格。但是在Windows系統中其API採用了'/n'的標準本意。對'/n'的不同解釋,造成了同樣的文本在不同的軟體中的顯示效果不相同。
方式二:和輸出裝置通訊.
這個方式我沒有嘗試過,不過用JNI可以實現。輸出裝置可能是軟體(比如常見的控制台視窗),也可能是硬體。如果是軟體的話,Java程式和此軟體通訊,讓其清屏(提供此功能的情況下)。如果是硬體可以和驅動通訊讓其清屏(提供此功能的情況下)。
對應上面給的例子,不要直接在NB6.8中運行,因為NB6.8的控制台沒有解析'/r'控制字元,這應該是其一個bug。在window上可以直接在cmd中運行。