Zweieinhalb Jahre Verspätung ist besser als nie, oder?
int System.in.read()
liest das nächste Datenbyte aus dem Eingabestrom. Aber ich bin mir sicher, dass Sie das bereits wussten, weil es trivial ist, nachzuschlagen. Also, was Sie wahrscheinlich fragen, ist:
Warum wird deklariert, ein int
zurückzugeben, wenn in der Dokumentation steht, dass es byte
liest?
und warum scheint es Müll zurückzugeben? (Ich tippe '9'
, aber es gibt 57
zurück.)
Es gibt ein int
zurück, da es neben allen möglichen Werten eines Bytes auch einen zusätzlichen Wert zurückgeben kann, um das End-of-Stream anzuzeigen. Also, es muss einen Typ zurückgeben, der mehr Werte ausdrücken kann als ein byte
.
Hinweis: Sie hätten es zu einem short
machen können, aber sie haben sich stattdessen für int
entschieden, möglicherweise als Hinweis auf C, dessen getc()
-Funktion auch% co_de zurückgibt %, aber noch wichtiger, weil int
ein wenig umständlich ist. (Die Sprache bietet keine Möglichkeit, ein short
Literal anzugeben, also müssen Sie ein short
literal angeben und es in int
umwandeln) Außerdem hat short
auf bestimmten Architekturen eine bessere Leistung als int
.
Es scheint Müll zu hinterlassen , denn wenn Sie ein Zeichen als Ganzzahl anzeigen, sehen Sie den ASCII (*) Wert dieses Zeichens. Also, eine '9' erscheint als 57. Aber wenn du sie auf einen Charakter wirfst, bekommst du '9', also ist alles gut.
Denken Sie einmal so darüber nach: Wenn Sie das Zeichen '9' eingegeben haben, ist es unsinnig zu erwarten, dass short
die Zahl 9 zurückgibt, denn welche Zahl würden Sie dann erwarten, wenn Sie ein% eingegeben hätten? Code%? Offensichtlich müssen Zeichen Zahlen zugeordnet werden. ASCII (*) ist ein System zum Zuordnen von Zeichen zu Zahlen. Und in diesem System entspricht das Zeichen "9" der Nummer 57, nicht der Nummer 9.
(*) Nicht unbedingt ASCII; es kann eine andere Kodierung sein, wie UTF-16; aber in der überwiegenden Mehrheit der Kodierungen und sicherlich in allen gängigen Kodierungen stimmen die ersten 127 Werte mit denen von ASCII überein. Und das schließt alle englischen alphanumerischen Zeichen und populäre Symbole ein.
System
ist eine letzte Klasse in java.lang
package
Codebeispiel aus dem Quellcode von api
%Vor% read()
ist eine abstrakte Methode der abstrakten Klasse InputStream
Kurz von der api:
Liest eine Anzahl von Bytes aus dem Eingabestrom und speichert sie in das Puffer-Array b. Die Anzahl der tatsächlich gelesenen Bytes wird als zurückgegeben eine ganze Zahl. Diese Methode blockiert bis zum Ende der Eingabedaten Datei wird erkannt oder eine Ausnahme wird ausgelöst.
System.in.read()
liest von die Standardeingabe .
Die Standardeingabe kann verwendet werden, um Eingaben von Benutzern in einer Konsolenumgebung zu erhalten. Da diese Benutzeroberfläche jedoch keine Bearbeitungsfunktionen bietet, ist die interaktive Verwendung der Standardeingabe auf Kurse beschränkt, die das Programmieren lehren.
Die meiste Verwendung der Standardeingabe in der Produktion findet in Programmen statt, die für den Betrieb in Pipelines von Unix-Befehlszeilen ausgelegt sind. In solchen Programmen stammt die Nutzlast, die das Programm verarbeitet, von der Standardeingabe, und das Ergebnis des Programms wird in die Standardausgabe geschrieben. In diesem Fall wird die Standardeingabe niemals direkt vom Benutzer geschrieben, es ist die umgeleitete Ausgabe eines anderen Programms oder der Inhalt einer Datei.
Eine typische Pipeline sieht folgendermaßen aus:
%Vor% sort
liest seine Daten von der Standardeingabe, die tatsächlich die Ausgabe ist des Befehls du
. Die sortierten Daten werden in die Standardausgabe von sort
geschrieben, die standardmäßig in der Konsole angezeigt wird und problemlos in eine Datei oder einen anderen Befehl umgeleitet werden kann.
Daher wird die Standardeingabe in Java vergleichsweise selten verwendet.
Um die akzeptierte Antwort zu ergänzen, könnten Sie auch System.out.read()
wie folgt verwenden:
Es erlaubt Ihnen, von der Standardeingabe (hauptsächlich die Konsole) zu lesen. Diese SO-Frage kann Ihnen helfen.
Dieses Beispiel soll helfen? Zusammen mit den Kommentaren, natürlich & gt;:)
WARNUNG: DER MANN IST IN DIESEM ABSATZ / POST EIN VERWENDETES FREQUENT WORD
Insgesamt empfehle ich, die Klasse Scanner
zu verwenden, da Sie große Sätze eingeben können. Ich bin mir nicht ganz sicher, ob System.in.read
solche Aspekte hat. Wenn möglich, korrigiere mich bitte.
Tags und Links java
Wikipedia für mehr ... Ссылка
Ich habe diese Funktion ursprünglich von der großartigen Excel-Seite von Chip Pearson erhalten.
Was ist eine gute Implementierung einer IsLeapYear-Funktion in VBA?
Bearbeiten: Ich habe die if-then und die DateSerial-Implementierung mit Iterationen in einem Timer ausgeführt und die DateSerial war im Durchschnitt 1-2 ms schneller (5 Läufe von 300 Iterationen mit 1 durchschnittliche Zellenarbeitsblattformel funktioniert auch).
Als eine Variante der Chip Pearson-Lösung könnten Sie auch
ausprobieren %Vor%Wenn Effizienz eine Überlegung ist und das erwartete Jahr zufällig ist, dann könnte es etwas besser sein, zuerst den häufigsten Fall zu machen:
%Vor%Ich fand dieses lustige auf CodeToad :
%Vor%Obwohl ich ziemlich sicher bin, dass die Verwendung von IsDate in einer Funktion wahrscheinlich langsamer ist als ein paar if, elseifs.
Hier ist eine weitere einfache Option.
%Vor%Wenn Leap_Day_Check = 28, dann ist es kein Schaltjahr, wenn es 29 ist.
VBA weiß, was das Datum vor dem 1. März in einem Jahr ist und wird es daher für den 28. oder 29. Februar für uns festlegen.
Ich sehe viele großartige Konzepte, die auf zusätzliches Verständnis hinweisen und die Verwendung von Datumsfunktionen, von denen man großartig lernen kann ... In Bezug auf Code-Effizienz .. Betrachten Sie den Maschinencode, der für die Ausführung einer Funktion erforderlich ist
anstelle komplexer Datumsfunktionen verwende nur ziemlich schnelle Integer-Funktionen BASIC wurde auf GOTO gebaut Ich vermute, dass etwas wie unten ist schneller
%Vor%Nein:
%Vor%