App下載

java怎么運(yùn)行系統(tǒng)命令?java清屏代碼的實(shí)現(xiàn)!

猿友 2021-07-03 16:55:56 瀏覽數(shù) (5500)
反饋

python怎么清屏?不同系統(tǒng)如何實(shí)現(xiàn)命令行清屏?中,小編介紹了python如何進(jìn)行清屏的方法。實(shí)際上,java要想實(shí)現(xiàn)清屏的效果,也需要使用相同的方式(即使用系統(tǒng)提供的清屏函數(shù))。今天小編就來(lái)介紹一下java怎么運(yùn)行cmd命令吧!

java為什么不能直接清屏

其實(shí)不止是java,還有python,c語(yǔ)言,大部分語(yǔ)言都沒(méi)有辦法直接清屏,想要清屏就需要調(diào)用系統(tǒng)的函數(shù)(其實(shí)是命令)。因?yàn)榍迤吝@個(gè)功能需要深入到系統(tǒng)內(nèi)核進(jìn)行操作,而普通的java程序是沒(méi)有辦法進(jìn)入內(nèi)核的(其實(shí)并不是沒(méi)有,在學(xué)習(xí)操作系統(tǒng)的相關(guān)課程之后就知道如何讓java程序進(jìn)入內(nèi)核態(tài))。簡(jiǎn)單的來(lái)說(shuō),操作系統(tǒng)分為用戶態(tài)和內(nèi)核態(tài),而清屏的功能只有內(nèi)核態(tài)可以實(shí)現(xiàn),java程序只是用戶態(tài),所以它無(wú)法實(shí)現(xiàn)清屏,只能通過(guò)內(nèi)核提供的命令來(lái)進(jìn)行清屏。

 關(guān)于用戶態(tài)和內(nèi)核態(tài)的知識(shí)其實(shí)對(duì)于初學(xué)java的程序員來(lái)說(shuō)不需要掌握太多,只需要知道java沒(méi)有直接清屏的功能就行了。

如何實(shí)現(xiàn)java的清屏

實(shí)現(xiàn)java的清屏其實(shí)和python使用的是同樣的方法,java也提供了相關(guān)的包可以讓java去使用cmd命令。接下來(lái)我們來(lái)介紹一下java如何調(diào)用cmd命令。

java調(diào)用cmd命令實(shí)例

以下是一個(gè)java調(diào)用cmd的ping命令的案例,具體代碼介紹已經(jīng)寫(xiě)在注釋里了。

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class cmd{
    public static void main(String[] args) {
        String command = "ping m.hgci.cn";//要輸入的命令的字符串
        try {//使用命令的過(guò)程可能會(huì)出現(xiàn)失敗,需要捕獲異常
            Process process = Runtime.getRuntime().exec(command);
            //使用process可以執(zhí)行命令
            process.waitFor();
            // 導(dǎo)致當(dāng)前線程等待,如有必要,一直要等到由該 Process對(duì)象表示的進(jìn)程已經(jīng)終止。
            //如果已終止該子進(jìn)程,此方法立即返回。
            //如果沒(méi)有終止該子進(jìn)程,調(diào)用的線程將被阻塞,直到退出子進(jìn)程。
            //根據(jù)慣例,0 表示正常終止
            BufferedReader out = new BufferedReader(
            new InputStreamReader(process.getInputStream(), "GBK")); //獲取命令的輸出流
            String outline = null;
            while ((outline = out.readLine()) != null) {
                System.out.println(outline);
            }//輸出命令的輸出流
            System.out.println("狀態(tài)值為:" + process.exitValue()); // 輸出命令的返回值(執(zhí)行狀態(tài),0為成功)
        } catch (Exception e) {
            
            e.printStackTrace();
        }
    }
}

從上面的代碼可以學(xué)習(xí)到,使用process的?Runtime.getRuntime().exec(command)?就可以執(zhí)行cmd的命令,但是如果要看到cmd命令返回的結(jié)果,需要使用process.getInputStream()? 來(lái)獲取cmd的輸出流。

進(jìn)階版process

上面版本的process是一種比較簡(jiǎn)單的執(zhí)行命令提示符的方法,但這種方法小編用來(lái)實(shí)現(xiàn)清屏的時(shí)候卻出現(xiàn)了差錯(cuò)。但是,他的進(jìn)階版——processbuilder就沒(méi)有這樣的問(wèn)題,接下來(lái)我們采用processbuilder進(jìn)行清屏代碼的實(shí)現(xiàn):

public class cmd{
    public static void main(String[] args) {
        System.out.println("打印一些無(wú)用的內(nèi)容");
        System.out.println("打印一些無(wú)用的內(nèi)容");
        System.out.println("打印一些無(wú)用的內(nèi)容");
        System.out.println("打印一些無(wú)用的內(nèi)容");
        System.out.println("打印一些無(wú)用的內(nèi)容");
        try {//使用命令的過(guò)程可能會(huì)出現(xiàn)失敗,需要捕獲異常
         //   Process process = Runtime.getRuntime().exec("cls");
         new ProcessBuilder("cmd", "/c", "cls")
         // 將 ProcessBuilder 對(duì)象的輸出管道和 Java 的進(jìn)程進(jìn)行關(guān)聯(lián),這個(gè)函數(shù)的返回值也是一個(gè)
         // ProcessBuilder
         .inheritIO()
         // 開(kāi)始執(zhí)行 ProcessBuilder 中的命令
         .start()
         // 等待 ProcessBuilder 中的清屏命令執(zhí)行完畢
         // 如果不等待則會(huì)出現(xiàn)清屏代碼后面的輸出被清掉的情況
         .waitFor(); // 清屏命令                   
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("現(xiàn)在沒(méi)有無(wú)用內(nèi)容了,我們來(lái)說(shuō)點(diǎn)重要滴事情");
        System.out.println("學(xué)編程,哪家強(qiáng)?互聯(lián)網(wǎng)上編程獅放光芒");
    }
}

現(xiàn)在代碼的運(yùn)行效果如下:

清屏

這樣就實(shí)現(xiàn)了清屏的功能了呢。

 據(jù)坊間傳聞,eclipse執(zhí)行上述代碼并不能清屏,小編沒(méi)有嘗試過(guò)(但是IDEA上試驗(yàn)確實(shí)不能清屏),但小編在VSCode中和使用命令行編譯運(yùn)行的時(shí)候是能實(shí)現(xiàn)清屏的。所以使用此方法不能清理eclipse和IDEA上的控制臺(tái),小伙伴們要是需要清屏還需要另找其他的辦法。

小結(jié)

以上就是關(guān)于java怎么運(yùn)行cmd命令的全部?jī)?nèi)容了,更多java學(xué)習(xí)請(qǐng)關(guān)注java編程獅


0 人點(diǎn)贊