Java: Xóa bàn điều khiển


Câu trả lời:


111

Vì có một số câu trả lời ở đây hiển thị mã không hoạt động cho Windows, nên đây là một cách làm rõ:

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

Lệnh này không hoạt động, vì hai lý do:

  1. Không có tên thực thi nào được đặt tên cls.exehoặc cls.comtrong bản cài đặt Windows tiêu chuẩn có thể được gọi thông qua Runtime.exec, vì lệnh nổi tiếng được tích clshợp vào trình thông dịch dòng lệnh của Windows.

  2. Khi khởi chạy một quy trình mới thông qua Runtime.exec, đầu ra tiêu chuẩn được chuyển hướng đến một đường ống mà quy trình Java khởi tạo có thể đọc được. Nhưng khi đầu ra của clslệnh được chuyển hướng, nó sẽ không xóa giao diện điều khiển.

Để giải quyết vấn đề này, chúng ta phải gọi trình thông dịch dòng lệnh ( cmd) và yêu cầu nó thực thi một lệnh ( /c cls) cho phép gọi các lệnh dựng sẵn. Hơn nữa, chúng ta phải kết nối trực tiếp kênh đầu ra của nó với kênh đầu ra của quy trình Java, hoạt động bắt đầu với Java 7, bằng cách sử dụng 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();
    }
}

Bây giờ khi quá trình Java được kết nối với một bàn điều khiển, tức là đã được bắt đầu từ một dòng lệnh mà không chuyển hướng đầu ra, nó sẽ xóa giao diện điều khiển.


1
Tại sao điều này không làm việc cho tôi? Tôi đang chạy chương trình trên windows CMD nhưng màn hình không bị xóa
Alist3r 22/03/2016

87

Bạn có thể sử dụng đoạn mã sau để xóa bảng điều khiển dòng lệnh:

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

Để tham khảo thêm, hãy truy cập: http://techno-terminal.blogspot.in/2014/12/clear-command-line-console-and-bold.html


2
Quan tâm để thêm vào điều này ở tất cả? Chuỗi này là gì và bạn có cần phải xóa nếu autoflush được bật không?
cossacksman

7
Chúng là mã thoát ANSI . Cụ thể là xóa màn hình, tiếp theo là nhà . Nhưng tại sao 'nhà' lại cần thiết?
jdurston

2
@jdurston bỏ qua nhà sẽ không đặt lại con trỏ trở lại đầu cửa sổ.
Hugo Zink

1
Không hoạt động trong Eclipse, nhưng hoạt động trong thiết bị đầu cuối Linux. Một phiếu bầu cho bạn
Anh Tuấn

7
Điều này chỉ hoạt động nếu trình giả lập thiết bị đầu cuối trong đó Java chạy, hỗ trợ mã thoát ANSI. Windows NT / XP / 7/8/10 CMD không
Thorbjørn Ravn Andersen

19

Đây là cách tôi sẽ xử lý nó. Phương pháp này sẽ hoạt động cho trường hợp HĐH Windows và trường hợp HĐH Linux / Unix (có nghĩa là nó cũng hoạt động cho 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.
    }
}

Lưu ý rằng phương pháp này thường sẽ không xóa bảng điều khiển nếu bạn đang chạy bên trong IDE.


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

1
@BenLeggiero Lỗi đó xảy ra nếu vì một lý do nào đó lệnh cls không được JVM tìm thấy trong một số thư mục từ biến môi trường PATH. Tất cả các mã này là gọi lệnh hệ thống Windows hoặc Unix dựa trên cấu hình hệ thống mặc định để xóa dấu nhắc lệnh hoặc cửa sổ đầu cuối tương ứng. Nó phải giống hệt như mở một cửa sổ đầu cuối và gõ "cls" theo sau là phím Enter.
Dyndrilliac

22
Không có clsthực thi trong Windows. Nó là một lệnh nội bộ của cmd.exe.
a_horse_with_no_name

7
Như những người khác đã nói, hoàn toàn không hoạt động , không chỉ vì Windows không có khả năng thực thi cls, mà còn bởi vì đầu ra của các quy trình con được chuyển hướng.
Holger

2
Câu trả lời này cũng là một chủ đề trên meta xem: meta.stackoverflow.com/questions/308950/iêu
Petter Friberg

15

Một cách để có được điều này có thể là in nhiều đầu dòng ("\ n") và mô phỏng màn hình rõ ràng. Cuối cùng, rõ ràng, nhiều nhất là trong vỏ unix, không xóa nội dung trước đó, chỉ di chuyển nó lên và nếu bạn thực hiện cuộn xuống có thể thấy nội dung trước đó.

Đây là một mã mẫu:

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

13
Một cách nhanh hơn để thực hiện điều này là in một chuỗi 50 \r\nvới một lần duy nhất println, vì có một độ trễ đáng chú ý giữa printlncác cuộc gọi.
Ben Leggiero

7
Làm thế nào để bạn biết có bao nhiêu dòng giao diện điều khiển được cấu hình để hiển thị? Có thể làm việc trong hầu hết các trường hợp, nhưng không phải tất cả.
Cypher

4
Sự khác biệt lớn nhất giữa cái này và cái thích hợp clearlà ở cái sau, đầu ra mới sẽ ở trên cùng của màn hình chứ không phải ở dưới cùng.
ndm13

5
System.out.println(new String(new char[50]).replace("\0", "\r\n"));sẽ làm công việc nhanh hơn và tốt hơn.
Aaron Esau

1
@AaronEsau bắt đầu với JDK 11, bạn có thể sử dụngSystem.out.println(System.lineSeparator().repeat(50));
Holger

15

Nếu bạn muốn một cách độc lập hệ thống hơn để làm điều này, bạn có thể sử dụng thư viện JLineConsoleReader.clearScreen () . Kiểm tra thận trọng xem JLine và ANSI có được hỗ trợ trong môi trường hiện tại có lẽ cũng đáng để thực hiện.

Một cái gì đó giống như đoạn mã sau đã làm việc cho tôi:

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 + "'.");

        }
    }
}

Khi chạy này, nếu bạn gõ 'xóa' tại dấu nhắc, nó sẽ xóa màn hình. Hãy chắc chắn rằng bạn chạy nó từ một thiết bị đầu cuối / bàn điều khiển thích hợp chứ không phải trong Eclipse.


14

Tạo một phương thức trong lớp của bạn như thế này: [như @Holger đã nói ở đây .]

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) {}
}

Điều này hoạt động cho các cửa sổ ít nhất, cho đến nay tôi chưa kiểm tra Linux. Nếu bất cứ ai kiểm tra nó cho Linux xin vui lòng cho tôi biết nếu nó hoạt động (hoặc không).

Như một phương pháp thay thế là viết mã này vào 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

Tôi sẽ không khuyên bạn nên sử dụng phương pháp này.


1
hoạt động tốt cho windows 10!
bò tót

7

Runtime.getR.78 (). Exec (cls) KHÔNG hoạt động trên máy tính xách tay XP của tôi. Điều này đã làm -

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

Hy vọng điều này hữu ích


nếu bạn có thể đặt vị trí chỉ mục bộ đệm để bắt đầu thì đây sẽ là cách tiếp cận đơn giản nhất
DevilInDisguise

1
Nếu quá trình bị gián đoạn, tôi tưởng tượng bạn sẽ thấy độ trễ với một số print.out bị xóa trước những cái khác.
TrevorLee

7

Hãy thử như sau:

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

Điều này sẽ hoạt động tốt trong môi trường Linux


2

Điều này sẽ hoạt động nếu bạn đang làm điều này trong Bluej hoặc bất kỳ phần mềm tương tự nào khác.

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

1

Bạn có thể sử dụng một mô phỏng clsvới for (int i = 0; i < 50; ++i) System.out.println();


2
Đó chỉ là một gợi ý, có lẽ ai đó muốn xóa màn hình, Thật ra
Sarz

@Sarz: và thực sự "xóa màn hình" cũng không có ý nghĩa chính xác
Gyom

0

Bạn cần sử dụng các ký tự điều khiển như dấu gạch chéo ngược (\ b) và trả về vận chuyển (\ r). Nó bị tắt theo mặc định, nhưng giao diện Console có thể diễn giải các điều khiển này.

Windows> PreferencesRun / Debug> Console và chọn Phiên dịch các ký tự điều khiển ASCII để kích hoạt nó

Tùy chọn bàn điều khiển trong Eclipse

Sau các cấu hình này, bạn có thể quản lý bảng điều khiển của mình với các ký tự điều khiển như:

\ t - tab.

\ b - backspace (lùi một bước trong văn bản hoặc xóa một ký tự).

\ n - dòng mới.

\ r - vận chuyển trở lại. ()

\ f - dạng thức ăn.

điều khiển nhật thực rõ ràng hoạt hình

Thêm thông tin tại: https://www.eclipse.org/eclipse/news/4.14/pl platform.php


-2

Bạn cần sử dụng JNI.

Trước hết, hãy tạo một tệp bằng cách sử dụng phòng thu trực quan, hệ thống gọi đó ("cls"). Sau đó, sử dụng JNI để sử dụng DDL này.

Tôi tìm thấy bài viết này là tốt đẹp:

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


Đó là công việc với tôi. Tôi có một dự án thực sự sử dụng JNI để xóa màn hình trong JAVA.
Denny

Ở Hungary, chúng tôi nói "Ông tấn công con ruồi bằng chùy".
Ambrus Tóth
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.