Dies ist das zweite Mal, dass REPL für Java 8 erstellt wird. Informationen zu Zweck und Vorsichtsmaßnahmen finden Sie im ersten Artikel.
Kommen wir nun zur Quellenbeschreibung.
Eine Schnittstelle, die Zugriff auf die Windows-Konsolen cmd und Eclipse bietet.
`input ()`
Schnittstelle zum Akzeptieren von Eingaben von der Konsole.`Print ()`
Schnittstelle der Bildschirmausgabemethode.cleanup ()
`Interface.Finalizable Schnittstelle zu den Methoden der Schnittstelle. interface Interface { ... }Es ist kein Fehler, sondern eine Dummy-Schnittstelle.
Das Erstellen einer kleinen Schnittstelle als einzelne Datei verkompliziert das Dateisystem, daher fügen wir ihm eine Schnittstelle hinzu.
#### **`Interface.java`**
```java
package console;
interface Interface {
/** console interface. */
interface Console extends Interface.Finalizable {
// methods for input string from console ======================================
default String input(String prompt);
// methods for output string to console =======================================
void print(String format, Object... args);
void print(String s);
// extends Inteeface.Finalizeable =============================================
void cleanup();
}
// ... more interface ...
}
Diese Datei ist auch gepackt ...
Die konkrete Konsolenklasse wird einfach erstellt und von `Console.create ()`
übergeben.
Service.java
package console;
public interface Service {
class Console {
public static final String newLine = System.lineSeparator();
private static final String defaultEncoding = "UTF-8";
public static Interface.Console create(String encoding) {
if ( encoding == null || encoding.trim().isEmpty() ) {
encoding = defaultEncoding;
}
if ( !java.nio.charset.Charset.isSupported(encoding) ) {
encoding = defaultEncoding;
}
return (System.console() != null)
? new SystemConsole(System.console())
: new StandardConsole(encoding);
}
// ///////////////////////////////////////////////////////////////////////////////
/** console uses standard in/out class.
*/ // ///////////////////////////////////////////////////////////////////////////
private static class StandardConsole implements Interface.Console {
protected StandardConsole(String encoding) {
try {
java.io.InputStreamReader istream = new java.io.InputStreamReader(System.in, encoding);
reader_ = new java.io.BufferedReader(istream);
out_ = new java.io.PrintStream(System.out, true, encoding);
} catch (java.io.IOException e) {
System.out.println( e.getMessage() );
}
}
// methods for input string from console ===============================
public String input(String prompt) {
out_.printf(prompt);
String s = "";
try {
s = reader_.readLine();
} catch (java.io.IOException e) {
System.out.println( e.getMEssage() );
}
return s;
}
// methods for output string to console ================================
public void print(String format, Object... args) { out_.printf(format, args); }
public void print(String s) { out_.println(s); }
// implements Finalizable.cleanup() ====================================
public void cleanup() {
out_.close();
out_ = null;
try {
reader_.close();
reader_ = null;
} catch(java.io.IOException e) {
System.out.println( e.getMessage() );
}
}
// internal fields =====================================================
java.io.BufferedReader reader_;
java.io.PrintStream out_;
}
// ///////////////////////////////////////////////////////////////////////////////
/** console uses System.console() class.
*/ // ///////////////////////////////////////////////////////////////////////////
private static class SystemConsole implements Interface.Console {
protected SystemConsole(java.io.Console con) {
console_ = con;
}
// methods for input string from console ===============================
public String input(String prompt) { return console_.readLine(prompt); }
// methods for output string to console ================================
public void print(String format, Object... args) {
console_.printf(format, args);
}
public void print(String s) {
console_.printf(s + Service.Console.newLine);
}
// implements Finalizable.cleanup() ====================================
public void cleanup() { /* no operation */ }
// internal fields =====================================================
java.io.Console console_;
}
}
}
Service.Console Obwohl dort Service steht, handelt es sich tatsächlich um eine Werksklasse der Konsole. Nimmt den Codierungsnamen der Konsole und generiert eine darauf basierende konkrete Konsolenklasse und gibt diese zurück. Wenn ein falscher Codierungsname übergeben wird, wird der Standardwert "UTF-8" festgelegt.
`System.console ()`
(Java 1.6 oder höher) verfügbar ist, wird ein Konsolenobjekt (SystemConsole) zurückgegeben, das es verwendet.`System.console ()`
nicht verfügbar ist, wird ein Konsolenobjekt (StandardinConsole) mit Standard-E / A (InputStreamReader und PrintStream) zurückgegeben. python
public interface Service {
class Console {
public static final String newLine = System.lineSeparator();
private static final String defaultEncoding = "UTF-8";
public static Interface.Console create(String encoding) {
if ( encoding == null || encoding.trim().isEmpty() ) {
encoding = defaultEncoding;
}
if ( !java.nio.charset.Charset.isSupported(encoding) ) {
encoding = defaultEncoding;
}
return (System.console() != null)
? new SystemConsole(System.console())
: new StandardConsole(encoding);
}
// ... inner class ...
}
SystemConsole Dies ist eine Konsolenklasse, die System.Console verwendet. Ich denke, dass keine besondere Erklärung notwendig ist, da die Verarbeitung einfach delegiert wird. In der obigen Service.Console versuche ich, die Codierung zu überprüfen, aber hier werde ich sie nicht verwenden, da die tatsächlich in der Konsole verwendete Codierung (cmd.exe usw.) initialisiert ist ( Anscheinend scheint es keine Möglichkeit zu geben, dies zu ändern.
python
public interface Service {
class Console {
// ...Kürzung...
// ///////////////////////////////////////////////////////////////////////////////
/** console uses System.console() class.
*/ // ///////////////////////////////////////////////////////////////////////////
private static class SystemConsole implements Interface.Console {
protected SystemConsole(java.io.Console con) { console_ = con; }
// methods for input string from console ===============================
public String input(String prompt) { return console_.readLine(prompt); }
// methods for output string to console ================================
public void print(String format, Object... args) {
console_.printf(format, args);
}
public void print(String s) {
console_.printf(s + Service.Console.newLine);
}
// implements Finalizable.cleanup() ====================================
public void cleanup() { /* no operation */ }
// internal fields =====================================================
java.io.Console console_;
}
}
}
StandardinConsole Dies ist eine Konsolenklasse, die Standard-E / A verwendet. Ich mache genau das Gleiche wie SystemConsole, aber dank der Kesselplatte wird die Codemenge verdoppelt. Trotzdem wird der Umfang der Beschreibung reduziert, da die Codierungsprüfung im Werk durchgeführt wird.
`StandardConsole (String)`
Der vom Argument empfangene Codierungsname wird in BufferReader und PrintStream festgelegt.`input (String)`
angezeigt und die von `BufferdReader.readLine ()`
empfangene Zeichenfolge zurückgegeben werden, aber der Code, der nur zwei Zeilen umfassen sollte, ist umständlich Insbesondere ... ~~ Diese Art von Ort ist nervig und ekelhaft ~~`print ()`
Dies wird nur auf PrintStream übertragen.`Cleanup ()`
Interface.Finalisierbare Implementierung der Interface-Methode. Obwohl BufferdReader und PrintStream dieselbe Verarbeitung ausführen, muss nur eine Ausnahme überprüft werden ... Solch ein Ort (rypython
public interface Service {
class Console {
// ...Kürzung...
// ///////////////////////////////////////////////////////////////////////////////
/** console uses standard in/out class.
*/ // ///////////////////////////////////////////////////////////////////////////
private static class StandardConsole implements Interface.Console {
protected StandardConsole(String encoding) {
try {
java.io.InputStreamReader istream = new java.io.InputStreamReader(System.in, encoding);
reader_ = new java.io.BufferedReader(istream);
out_ = new java.io.PrintStream(System.out, true, encoding);
} catch (java.io.IOException e) {
System.out.println( e.getMessage() );
}
}
// methods for input string from console ===============================
public String input(String prompt) {
out_.printf(prompt);
String s = "";
try {
s = reader_.readLine();
} catch (java.io.IOException e) {
System.out.println( e.getMessage() );
}
return s;
}
// methods for output string to console ================================
public void print(String format, Object... args) { out_.printf(format, args); }
public void print(String s) { out_.println(s); }
// implements Finalizable.cleanup() ====================================
public void cleanup() {
out_.close();
out_ = null;
try {
reader_.close();
reader_ = null;
} catch(java.io.IOException e) {
System.out.println( e.getMessage() );
}
}
// internal fields =====================================================
java.io.BufferedReader reader_;
java.io.PrintStream out_;
}
}
Die vorherige BaseREPL wurde ebenfalls geändert, da Sie den Codierungsnamen übergeben müssen. Hier werden nur die korrigierten Teile beschrieben. Den vollständigen Code finden Sie unter Vorheriger Artikel.
`BaseREPL ()`
akzeptiert jetzt den Codierungsnamen, der an die Konsole übergeben werden soll. BaseREPL.java
class BaseREPL {
BaseREPL(String encoding) {
if ( encoding == null || encoding.trim().isEmpty() ) { encoding = "UTF-8"; }
console_ = Service.Console.create(encoding);
}
// ...Unterwegs weggelassen...
// internal fields =============================================================
protected final Interface.Console console_;
}
Dieses Mal erklärte ich die von REPL verwendete Konsole. Anfangs war es kompakt, aber während ich es reparierte, wurde es ein anständiges Volumen.
Noch einige Male werden wir weiterhin Klassen erstellen, die in REPL aufgenommen werden sollen.
Recommended Posts