Implementieren Sie dieselbe Funktion wie das C, C ++ - System ("cls") in Java

Einführung

Ich habe vor einiger Zeit ein Konsolen-Othello-Spiel in C-Sprache gemacht Als ich versuchte, es mit Java zu machen Ich habe mich gefragt, ob das in C hergestellte System ("cls") in Java ausgeführt werden kann, aber Ich hatte große Probleme, deshalb schreibe ich es hier auf.

Wenn Sie googeln

Es scheint mehrere Möglichkeiten zu geben, Es gab viele verwirrende Dinge wie Fehler und Warnungen. Unter ihnen werde ich die vorstellen, die diesmal am reibungslosesten umgesetzt werden konnte.

Diesmal bei der Herstellung von Othello Ich wollte auch die Erweiterbarkeit in Betracht ziehen, wenn ich die Ausgabe des Bildschirms steuern wollte Erstellen Sie eine ConsoleControl-Klasse, die die Ausgabe des Konsolenbildschirms steuert Es wurde als clearScreen-Methode implementiert, die die Bildschirmausgabe löscht.

Sorce Code ##

import java.io.IOException;

/**
 *Klasse, die die Ausgabe des Konsolenbildschirms steuert
 */
public class ConsoleControl {
	/**
	 *Methode zum Löschen der Ausgabe des Konsolenbildschirms
	 * @throws	IOException
	 * @throws 	InterruptedException
	 */
	public void clearScreen() throws IOException, InterruptedException {
        new ProcessBuilder("cmd", "/c", "cls").inheritIO().start().waitFor();
    }
}

Durch Aufrufen der clearScreen-Methode in der Hauptmethode vorerst Ich konnte die an der Eingabeaufforderung angezeigte Zeichenfolge löschen.

Endlich

Ich konnte immer noch nicht verstehen, warum es "cls" sein würde, wenn ich es wegen meines Mangels an Wissen so schrieb. Nachdem ich mein Verständnis studiert und eingeholt habe, möchte ich diesen Betrag in einer zusätzlichen Notiz hinzufügen.

Späteres Gespräch

26.04.2018 Nachtrag Als ich nach langer Zeit besuchte, war die Anzahl der Aufrufe fast 2000 statt 1000 Aufrufe Während ich es als Live-Übertragungsmaterial schluckte, analysierte ich dieses Programm und untersuchte, welche Art von Verarbeitung es tat. Kusso, ungefähr schlau.

ProccessBuilder-Klasse

Wenn Sie sich zunächst die offizielle Erklärung zu dieser ProccessBuilder-Klasse ansehen, Mit den Worten "eine Klasse zum Erstellen einer Instanz der Process-Klasse" Durch Erstellen einer Instanz dieser Klasse ist es möglich, mithilfe externer Befehle eine Ausführungsumgebung für einen neuen Prozess zu erstellen. Betrachten Sie den Inhalt mit Open JDK SE8, Der im Argument des Konstruktors angegebene Befehl befindet sich in der ProcessBuilder-Klasse Es wurde in einer Variablen vom Typ List mit dem Namen command gespeichert. Unten finden Sie ein Quellenzitat aus dem Open JDK

    private List<String> command;
    private File directory;
    private Map<String,String> environment;
    private boolean redirectErrorStream;
    private Redirect[] redirects;

    public ProcessBuilder(String... command) {
        this.command = new ArrayList<>(command.length);
        for (String arg : command)
            this.command.add(arg);
    }

inheritIO-Methode

Diese Methode wurde wie folgt definiert. (Quellenzitat von Open JDK)

    public ProcessBuilder inheritIO() {
        Arrays.fill(redirects(), Redirect.INHERIT);
        return this;
    }

Diese Methode weist Umleitungen mit der Funktion Arrays.fill einfach das INHERIT-Flag zu. Was bedeutet diese INHERIT-Flagge? Die offizielle Beschreibung lautet:

Dies ist das normale Verhalten der meisten Befehlsinterpreter (Shells) für Betriebssysteme.

Die Erklärung zur inheritIO-Methode lautet ebenfalls

Stellen Sie die Standard-Eingabe- / Ausgabequelle und das Ausgabeziel des Unterprozesses so ein, dass sie mit dem aktuellen Java-Prozess übereinstimmen. Dies ist eine einfache Methode. Die folgende Form des Anrufs pb.inheritIO() Es verhält sich genauso wie beim nächsten Anruf. pb.redirectInput(Redirect.INHERIT) .redirectOutput(Redirect.INHERIT) .redirectError(Redirect.INHERIT) Dieses Verhalten entspricht den meisten Befehlsinterpreten für Betriebssysteme und dem Standardsystem für C-Bibliotheksfunktionen ().

Mit anderen Worten, es stellte sich heraus, dass die Eingabe und Ausgabe externer Programme in die Standardeingabe und -ausgabe von Java integriert werden kann. Siehe hier für die Standardeingabe / -ausgabe. Nun, am Ende der offiziellen Erklärung

Dieses Verhalten entspricht den meisten Befehlsinterpreten für Betriebssysteme und dem Standardsystem für C-Bibliotheksfunktionen ().

Wenn Sie denken, dass es genauso funktioniert wie system (), können Sie das Mandokusai mit poi erklären.

Startmethode

Die Quelle ist lang und wird daher weggelassen. Diese Methode startet den von ProcessBuilder angegebenen Befehl oder die ausführbare Datei. Irgendwie kann man das aus dem Methodennamen erraten.

waitFor Methode

Die Quelle ist (ry Diese Methode lässt den aktuell verarbeiteten Thread warten, bis der in einem anderen Thread ausgeführte Unterprozess endet.

Zusammenfassung

Ich habe die vorherige Quelle wie folgt geändert.

import java.io.IOException;

public class ConsoleControl {
	private ProcessBuilder pb;

	/**
	 *Der Konstruktor für die ConsoleControl-Klasse.
	 *Erstellt eine Umgebung zum Ausführen eines neuen Prozesses, der den angegebenen Befehl ausführt.
	 * @param Befehl Befehl zum Ausführen
	 */
	public ConsoleControl(String... command) {
		pb = new ProcessBuilder(command);
	}

	/**
	 *Eine Methode, die den Eingabeaufforderungsbildschirm löscht.
	 */
	public void cls() throws IOException, InterruptedException {
		pb.inheritIO().start().waitFor();
		/*
		 * //Externer Befehl, der im Konstruktorargument von ProcesserBuild angegeben ist
		 * //Zur Ausführung an der Eingabeaufforderung konvertiert
		 * ProcessBuilder pbInheritIO = pb.inheritIO();
		 * //Mit externem Befehl ausführen
		 * Process pro = pbInheritIO.start();
		 * //Warten Sie, bis der auf einem anderen Thread ausgeführte Prozess abgeschlossen ist
		 * pro.waitFor();
		 */
	}
}

Für Windows

var cc = new ConsoleControl("cmd", "/c", "cls");

Für Linux

var cc = new ConsoleControl("/bin/bash", "-c", "clear");

Ist es so Vielleicht ist die Erklärung unzureichend oder wird missverstanden, daher wäre ich Ihnen dankbar, wenn Sie darauf hinweisen könnten. Wenn Sie Freizeit haben, würde ich mich freuen, wenn Sie uns für eine Live-Übertragung besuchen könnten.

Ende.

Recommended Posts

Implementieren Sie dieselbe Funktion wie das C, C ++ - System ("cls") in Java
Implementieren Sie die PHP-Implodierungsfunktion in Java
[Java] Implementieren Sie eine Funktion, die eine im Builder-Muster implementierte Klasse verwendet
[Java] In der Ausgabe wird etwas als "-0.0" angezeigt
Importieren Sie Dateien derselben Hierarchie in Java
Analysieren Sie die Datums- und Zeitzeichenfolge, die von der asctime-Funktion der C-Sprache in Java formatiert wurde
Ich habe versucht, die Methode der gegenseitigen Teilung von Eugrid in Java zu implementieren
Unterschiede im Code bei Verwendung des Längensystems in Java
Java-Desktop mit demselben Frontend wie das WEB.
Implementieren Sie die Anwendungsfunktion in Rails
Ich habe [Klonmethode für Java-Arrays] als Klonmethode in Java-Arrays übersetzt.
Siehe C ++ im Android Studio-Modul (Java / Kotlin)
Implementierung der zweistufigen Authentifizierung in Java
Ein Kampf, wenn Sie versuchen, dasselbe wie Javas XOR-Modus in C # zu tun
Implementieren Sie eine Kombination aus Mathematik in Java
2 Implementieren Sie eine einfache Syntaxanalyse in Java
Implementieren Sie das Senden von E-Mails in Java
Implementieren Sie eine funktionsähnliche schnelle Sortierung in Java
Reproduzieren Sie die Java-Enumeration in C #
Implementieren Sie rm -rf in Java.
Implementieren Sie die XML-Signatur in Java
Verwendung der in Kotlins Schnittstelle implementierten Funktion, die in Maven als Standardimplementierung von Java 8 eingeführt wurde
Untersuchen Sie die Systeminformationen der AWS Lambda-Betriebsumgebung in Java
Besiege den Aufwand, C-Arrays von Swift als Tupel zu behandeln
Rails Private Methoden tun weh, wenn Sie sich genauso fühlen wie Java!
Rails 6 (standardmäßig mit Webpacker) implementiert die Sternebewertungsfunktion
Beurteilen Sie, ob die zu vergleichenden Zeichenfolgen in Java identisch sind
Verwendung von MinIO mit derselben Funktion wie S3 Verwenden Sie Docker-Compose
Greifen Sie mit Java auf die Netzwerkschnittstelle zu
Implementieren Sie einen tabellengesteuerten Test in Java 14
Errate den Zeichencode in Java
3 Implementieren Sie einen einfachen Interpreter in Java
Lesen Sie die Java-Eigenschaftendatei in C #
Geben Sie den Java-Speicherort in eclipse.ini an
Java, JavaScript, C # (Unterschied in der Zuordnung)
Entpacken Sie die Zip-Datei in Java
Implementieren Sie reCAPTCHA v3 in Java / Spring
Analysieren der COTOHA-API-Syntaxanalyse in Java
Versuchen Sie, Yuma in Java zu implementieren
Implementieren Sie die CSV-Download-Funktion in Rails
1 Implementieren Sie eine einfache Phrasenanalyse in Java
Implementierung einer ähnlichen Funktion in Java
Rufen Sie die Super-Methode in Java auf
Holen Sie sich das Ergebnis von POST in Java
So implementieren Sie die Datumsberechnung in Java
So implementieren Sie den Kalman-Filter mit Java
Implementieren Sie API Gateway Lambda Authorizer in Java Lambda
Java-Referenz zum Verständnis in der Abbildung
Versuchen Sie, n-ary Addition in Java zu implementieren
Versuchen Sie es mit der Stream-API in Java
Implementieren Sie den Algorithmus in Ruby: Tag 1 - Europäische gegenseitige Teilung -
Ich habe das neue Yuan-Problem in Java ausprobiert
[Java] Verwenden Sie kryptografische Technologie mit Standardbibliotheken
Notizen im Kopf organisieren (Java-Arrangement)
Versuchen Sie, den CORBA-Dienst unter Java 11+ aufzurufen