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.
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.
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.
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.
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
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);
}
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.
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.
Die Quelle ist (ry Diese Methode lässt den aktuell verarbeiteten Thread warten, bis der in einem anderen Thread ausgeführte Unterprozess endet.
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();
*/
}
}
var cc = new ConsoleControl("cmd", "/c", "cls");
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