Java:コンソールをクリアする


回答:


111

Windowsで機能しないコードを示すいくつかの回答があるため、ここに説明があります。

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

このコマンドは、次の2つの理由で機能しませ

  1. 何という名前の実行はありませんcls.execls.com経由で呼び出すことができ、標準のWindowsインストールではRuntime.execよく知られているコマンドのように、clsWindowsのコマンドラインインタプリタへの組み込みですが。

  2. を介して新しいプロセスを起動するRuntime.execと、標準出力は、開始Javaプロセスが読み取ることができるパイプにリダイレクトされます。ただし、clsコマンドの出力がリダイレクトされても、コンソールはクリアされません。

この問題を解決するには、コマンドラインインタープリター(cmd)を/c cls呼び出して、組み込みコマンドを呼び出すことができるコマンド()を実行するように指示する必要があります。さらに、次のコマンドを使用して、その出力チャネルを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 2015年

7
これらはANSIエスケープコードです。具体的には画面をクリアしてからホームを押します。しかし、なぜ「家」が必要なのでしょうか。
jdurston、2015年

2
@jdurstonがホームを省略しても、カーソルはウィンドウの上部にリセットされません。
Hugo Zink 2016

1
Eclipseでは機能しませんが、Linuxターミナルでは機能します。1つの投票
Anh Tuan

7
これは、Javaが実行されている端末エミュレータがANSIエスケープコードをサポートしている場合にのみ機能します。Windows NT / XP /
7/8/10

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このエラーは、何らかの理由でJVMがPATH環境変数のあるディレクトリ内でclsコマンドを見つけられない場合に発生します。このコードが行うことはすべて、デフォルトのシステム構成に基づいてWindowsまたはUnixシステムコマンドを呼び出し、それぞれコマンドプロンプトまたはターミナルウィンドウをクリアすることです。これは、ターミナルウィンドウを開いて「cls」と入力してEnterキーを押すのとまったく同じです。
Dyndrilliac 2014年

22
clsWindowsには実行可能ファイルはありません。の内部コマンドですcmd.exe
a_horse_with_no_name 2015年

7
他の人が言ったように、Windowsにはcls実行可能ファイルがないだけでなく、サブプロセスの出力がリダイレクトされるため、まったく機能しません
Holger、2015年

2
この答えはまた、メタを参照してください。トピックです:meta.stackoverflow.com/questions/308950/...
ペッターFribergの

15

これを取得する方法は、複数の行末( "\ n")を印刷して、クリアな画面をシミュレートすることです。最後のクリアでは、多くの場合、UNIXシェルでは、前のコンテンツを削除せず、上に移動するだけです。下にスクロールすると、前のコンテンツが表示されます。

これがサンプルコードです:

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

13
呼び出しの間に顕著な遅延があるため\r\n、これを実現するより速い方法は、50の単一の文字列を単一printlnので出力することprintlnです。
Ben Leggiero 2014年

7
コンソールが表示するように設定されている行数を知るにはどうすればよいですか?ほとんどの場合は機能する可能性がありますが、すべてが機能するわけではありません。
Cypher

4
これと適切なものとの最大の違いclearは、後者の場合、新しい出力は画面の上部ではなく上部に表示されることです。
ndm13

5
System.out.println(new String(new char[50]).replace("\0", "\r\n"));より速く、より良い仕事をします。
アーロンエサウ2017

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
プロセスが中断された場合、print.outが他の前に削除されることで遅れが生じると思います。
TrevorLee、


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)として使用する必要があります。デフォルトでは無効になっていますが、コンソールビューでこれらのコントロールを解釈できます。

[ウィンドウ]> [設定]と[ 実行/デバッグ]> [コンソール]クリックし、[ ASCII制御文字の解釈]を選択して有効にします。

Eclipseのコンソール設定

これらの構成後、次のような制御文字を使用してコンソールを管理できます。

\ t-タブ。

\ b-バックスペース(テキストの1つ前のステップまたは単一の文字の削除)。

\ n-新しい行。

\ r-キャリッジリターン。()

\ f-フォームフィード。

日食コンソールのクリアアニメーション

詳細:https : //www.eclipse.org/eclipse/news/4.14/platform.php


-2

JNIを使​​用する必要があります。

まず、Visual Studioを使用して.dllを作成し、system( "cls")を呼び出します。その後、JNIを使​​用してこのDDLを使用します。

私は素晴らしいこの記事を見つけました:

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


それは私にとって仕事です。JNIを使​​用してJAVAで画面をクリアする実際のプロジェクトがあります。
デニー

ハンガリーでは、「彼はメイスでフライを打つ」と言います。
AmbrusTóth
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.