Java: ล้างคอนโซล


140

ร่างกายใด ๆ โปรดบอกฉันว่ารหัสที่ใช้สำหรับหน้าจอที่ชัดเจนใน Java ตัวอย่างเช่นใน C ++

system("CLS");

รหัสใดที่ใช้ใน Java สำหรับหน้าจอที่ชัดเจน?

ขอบคุณ!


คำตอบ:


111

เนื่องจากมีหลายคำตอบที่แสดงรหัสที่ไม่ทำงานสำหรับ Windows นี่คือคำชี้แจง:

Runtime.getRuntime().exec("cls");

คำสั่งนี้ใช้ไม่ได้ด้วยเหตุผลสองประการ:

  1. ไม่มีชื่อที่สามารถเรียกใช้งานได้cls.exeหรือcls.comในการติดตั้ง Windows มาตรฐานที่สามารถเรียกใช้ได้ผ่านทางRuntime.execเนื่องจากคำสั่งที่รู้จักกันดีclsนั้นมีอยู่แล้วภายในตัวแปลบรรทัดคำสั่งของ Windows

  2. เมื่อเรียกใช้กระบวนการใหม่ผ่านRuntime.execเอาต์พุตมาตรฐานจะถูกเปลี่ยนเส้นทางไปยังไพพ์ซึ่งกระบวนการ Java เริ่มต้นสามารถอ่านได้ แต่เมื่อเอาต์พุตของclsคำสั่งถูกเปลี่ยนทิศทางมันจะไม่ล้างคอนโซล

เพื่อแก้ปัญหานี้เราต้องเรียกล่ามบรรทัดคำสั่ง ( cmd) และบอกให้รันคำสั่ง ( /c cls) ซึ่งอนุญาตให้เรียกใช้คำสั่ง builtin ต่อไปเราจะต้องเชื่อมต่อช่องสัญญาณออกโดยตรงกับช่องสัญญาณออกของกระบวนการ Java ซึ่งเริ่มต้นด้วย Java 7 โดยใช้inheritIO():

import java.io.IOException;

public class CLS {
    public static void main(String... arg) throws IOException, InterruptedException {
        new ProcessBuilder("cmd", "/c", "cls").inheritIO().start().waitFor();
    }
}

ตอนนี้เมื่อกระบวนการ Java เชื่อมต่อกับคอนโซลนั่นคือเริ่มต้นจากบรรทัดคำสั่งโดยไม่มีการเปลี่ยนเส้นทางออกก็จะล้างคอนโซล


1
ทำไมสิ่งนี้ไม่ได้ผลสำหรับฉัน ฉันเรียกใช้โปรแกรมบน windows CMD แต่หน้าจอไม่ถูกล้าง
Alist3r

87

คุณสามารถใช้รหัสต่อไปนี้เพื่อล้างคอนโซลบรรทัดคำสั่ง:

public static void clearScreen() {  
    System.out.print("\033[H\033[2J");  
    System.out.flush();  
}  

สำหรับการอ้างอิงเพิ่มเติมไปที่: http://techno-terminal.blogspot.in/2014/12/clear-command-line-console-and-bold.html


2
สนใจที่จะเพิ่มสิ่งนี้หรือไม่? สตริงนี้คืออะไรและคุณต้องล้างข้อมูลถ้าเปิดใช้งานการป้อนอัตโนมัติหรือไม่
cossacksman

7
พวกเขาเป็นANSI รหัสหนี โดยเฉพาะที่หน้าจอที่ชัดเจนตามบ้าน แต่ทำไมบ้านถึงจำเป็น?
jdurston

2
@jdurston ไม่อยู่บ้านจะไม่รีเซ็ตเคอร์เซอร์กลับไปที่ด้านบนของหน้าต่าง
Hugo Zink

1
ไม่ทำงานใน Eclipse แต่ทำงานใน terminal Linux หนึ่งคะแนนสำหรับคุณ
Anh Tuan

7
ใช้งานได้เฉพาะเมื่อเทอร์มินัลอีมูเลเตอร์ซึ่ง Java ทำงานอยู่สนับสนุน ANSI escape code Windows NT / XP / 7/8/10 CMD ไม่ได้
Thorbjørn Ravn Andersen

19

นี่คือวิธีที่ฉันจะจัดการกับมัน วิธีนี้จะใช้ได้กับเคส Windows OS และเคส Linux / Unix OS (ซึ่งหมายความว่าใช้งานได้กับ Mac OS X)

public final static void clearConsole()
{
    try
    {
        final String os = System.getProperty("os.name");

        if (os.contains("Windows"))
        {
            Runtime.getRuntime().exec("cls");
        }
        else
        {
            Runtime.getRuntime().exec("clear");
        }
    }
    catch (final Exception e)
    {
        //  Handle any exceptions.
    }
}

โปรดทราบว่าวิธีนี้โดยทั่วไปจะไม่ล้างคอนโซลหากคุณกำลังทำงานภายใน IDE


10
ใน Windows 8.1:java.io.IOException: Cannot run program "cls": CreateProcess error=2, The system cannot find the file specified
Ben Leggiero

1
@BenLeggiero ข้อผิดพลาดนั้นเกิดขึ้นหากด้วยเหตุผลบางอย่างคำสั่ง cls ไม่พบโดย JVM ภายในบางไดเร็กทอรีจากตัวแปรสภาพแวดล้อม PATH รหัสทั้งหมดนี้จะเรียกคำสั่งระบบ Windows หรือ Unix ตามการกำหนดค่าระบบเริ่มต้นเพื่อล้างคำสั่งหรือหน้าต่าง terminal ตามลำดับ มันควรจะเหมือนกับเปิดหน้าต่างเทอร์มินัลและพิมพ์ "cls" ตามด้วยปุ่ม Enter
Dyndrilliac

22
ไม่มีclsปฏิบัติการใน Windows มันเป็นภายในcmd.exeคำสั่งของ
a_horse_with_no_name

7
อย่างที่คนอื่นพูดไม่ทำงานเลยไม่เพียงเพราะ Windows ไม่มีไฟล์ปฏิบัติการ cls แต่ยังเป็นเพราะผลลัพธ์ของ subprocesses ถูกเปลี่ยนเส้นทาง
Holger

2
คำตอบนี้เป็นหัวข้อที่ meta see: meta.stackoverflow.com/questions/308950/…
Petter Friberg

15

วิธีในการรับสิ่งนี้สามารถพิมพ์หลาย ๆ บรรทัด ("\ n") และจำลองหน้าจอที่ชัดเจน ในตอนท้ายที่ชัดเจนที่สุดในยูนิกซ์เชลล์ไม่ได้ลบเนื้อหาก่อนหน้าเพียงเลื่อนขึ้นและถ้าคุณเลื่อนลงสามารถดูเนื้อหาก่อนหน้า

นี่คือตัวอย่างรหัส:

for (int i = 0; i < 50; ++i) System.out.println();

13
วิธีที่เร็วกว่าในการทำสิ่งนี้ให้สำเร็จคือการพิมพ์สตริงเดี่ยว 50 \r\nด้วยสายเดี่ยวprintlnเนื่องจากมีความล่าช้าที่เห็นได้ชัดระหว่างการprintlnโทร
Ben Leggiero

7
คุณจะรู้ได้อย่างไรว่ามีการกำหนดค่าคอนโซลจำนวนบรรทัดให้แสดงผลอย่างไร อาจทำงานได้ในกรณีส่วนใหญ่ แต่ไม่ใช่ทั้งหมด
Cypher

4
ความแตกต่างที่ใหญ่ที่สุดระหว่างสิ่งนี้กับสิ่งที่เหมาะสมclearคือในตอนหลังเอาต์พุตใหม่จะอยู่ที่ด้านบนของหน้าจอไม่ใช่ด้านล่าง
ndm13

5
System.out.println(new String(new char[50]).replace("\0", "\r\n"));จะทำงานได้เร็วขึ้นและดีขึ้น
Aaron Esau

1
@AaronEsau เริ่มต้นด้วย JDK 11 คุณสามารถใช้System.out.println(System.lineSeparator().repeat(50));
Holger

15

ถ้าคุณต้องการให้ระบบทางเป็นอิสระมากขึ้นในการทำเช่นนี้คุณสามารถใช้JLineห้องสมุดและConsoleReader.clearScreen () การตรวจสอบอย่างรอบคอบว่ามีการสนับสนุน JLine และ ANSIในสภาพแวดล้อมปัจจุบันหรือไม่

บางอย่างเช่นรหัสต่อไปนี้ทำงานให้ฉัน:

import jline.console.ConsoleReader;

public class JLineTest
{
    public static void main(String... args)
    throws Exception
    {
        ConsoleReader r = new ConsoleReader();

        while (true)
        {
            r.println("Good morning");
            r.flush();

            String input = r.readLine("prompt>");

            if ("clear".equals(input))
                r.clearScreen();
            else if ("exit".equals(input))
                return;
            else
                System.out.println("You typed '" + input + "'.");

        }
    }
}

เมื่อเรียกใช้งานนี้หากคุณพิมพ์ 'clear' ที่พรอมต์มันจะทำการล้างหน้าจอ ตรวจสอบให้แน่ใจว่าคุณเรียกใช้จากเทอร์มินัล / คอนโซลที่เหมาะสมและไม่ได้อยู่ใน Eclipse


14

สร้างวิธีการในชั้นเรียนของคุณเช่นนี้: [ตาม@Holgerพูดที่นี่ ]

public static void clrscr(){
    //Clears Screen in java
    try {
        if (System.getProperty("os.name").contains("Windows"))
            new ProcessBuilder("cmd", "/c", "cls").inheritIO().start().waitFor();
        else
            Runtime.getRuntime().exec("clear");
    } catch (IOException | InterruptedException ex) {}
}

อย่างน้อยก็ใช้งานได้กับ windows ฉันยังไม่ได้ตรวจสอบสำหรับ Linux หากใครตรวจสอบหา Linux โปรดแจ้งให้เราทราบว่ามันใช้งานได้ (หรือไม่)

ในฐานะที่เป็นวิธีการอื่นคือการเขียนรหัสนี้ในclrscr():

for(int i = 0; i < 80*300; i++) // Default Height of cmd is 300 and Default width is 80
    System.out.print("\b"); // Prints a backspace

ฉันจะไม่แนะนำให้คุณใช้วิธีนี้


1
ทำงานได้ดีสำหรับ windows 10!
gaurav

7

Runtime.getRuntime (). exec (cls) ไม่ทำงานบนแล็ปท็อป XP ของฉัน สิ่งนี้ทำ -

for(int clear = 0; clear < 1000; clear++)
  {
     System.out.println("\b") ;
  }

หวังว่านี่จะเป็นประโยชน์


ถ้าคุณสามารถตั้งค่าตำแหน่งดัชนีบัฟเฟอร์เพื่อเริ่มต้นนี้จะเป็นวิธีที่ง่ายที่สุด แต่เพียงผู้เดียว
DevilInDisguise

1
หากกระบวนการขัดจังหวะฉันคิดว่าคุณอาจเห็นว่างานพิมพ์บางส่วนล่าช้าออกไปก่อนที่คนอื่นจะพิมพ์ออกมา
TrevorLee

7

ลองทำสิ่งต่อไปนี้:

System.out.print("\033\143");

สิ่งนี้จะทำงานได้ดีในสภาพแวดล้อม Linux


2

วิธีนี้จะใช้งานได้หากคุณทำสิ่งนี้ใน Bluej หรือซอฟต์แวร์อื่นที่คล้ายคลึงกัน

System.out.print('\u000C');

1

คุณสามารถใช้การจำลองclsด้วย for (int i = 0; i < 50; ++i) System.out.println();


2
มันเป็นเพียงคำใบ้บางทีบางคนต้องการล้างหน้าจอจริง ๆ แล้ว
Sarz

@Sarz: และที่จริงแล้ว "การล้างหน้าจอ" ไม่เหมาะสมด้วยตัวเองอย่างใดอย่างหนึ่ง
Gyom

0

คุณต้องใช้อักขระควบคุมเป็นเครื่องหมายแบ็กสแลช (\ b) และแคร่กลับ (\ r) มันถูกปิดใช้งานโดยค่าเริ่มต้น แต่มุมมองคอนโซลสามารถตีความการควบคุมเหล่านี้ได้

Windows> การกำหนดค่าตามความชอบและRun / Debug> คอนโซลและเลือกตีความอักขระควบคุม ASCIIเพื่อเปิดใช้งาน

ค่ากำหนดคอนโซลใน Eclipse

หลังจากการกำหนดค่าเหล่านี้คุณสามารถจัดการคอนโซลด้วยอักขระควบคุมเช่น:

แท็บ \ t -

\ b - backspace (ขั้นตอนย้อนหลังในข้อความหรือการลบอักขระเดียว)

\ n - บรรทัดใหม่

\ r - รับคืนรถ ()

\ f - ฟีดฟอร์ม

ภาพเคลื่อนไหวชัดเจนคอนโซล eclipse

ข้อมูลเพิ่มเติมได้ที่: https://www.eclipse.org/eclipse/news/4.14/platform.php


-2

คุณต้องใช้ JNI

ก่อนอื่นให้ใช้สร้าง. dll โดยใช้ visual studio, ระบบเรียก ("cls") หลังจากนั้นใช้ JNI เพื่อใช้ DDL นี้

ฉันพบบทความที่ดี:

http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=5170&lngWId=2


นั่นเป็นงานของฉัน ฉันมีโครงการจริงโดยใช้ JNI เพื่อล้างหน้าจอใน JAVA
Denny

ในฮังการีเราพูดว่า "เขาโจมตีด้วยกระบอง"
Ambrus Tóth
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.