1) Praktycznie rzecz biorąc: jak zrobić kodowanie znaków pracę, i jak należy radzić sobie z nimi:
Każdy strumień znaków, które są odczytywane są kodowane/dekodowane. Java zawiera specyfikacje kodowania/dekodowania jako część JDK: http://docs.oracle.com/javase/1.6/docs/guide/intl/encoding.doc.html. Przykład: UTF-8 issue in Java code.
2) Twoje szczegółowe pytanie: W jaki sposób wieloplatformowy język JAVA obsługuje wejście konsoli, które jest specyficzne dla systemu operacyjnego?
Krótka odpowiedź: Mimo że kod bajtowy Java jest neutralny dla platformy, JVM NIE jest. Oznacza to, że funkcja przesyłania strumieniowego Java "System" "in/out/err" nie jest w pełni zaimplementowana w zwykłej starej wersji java!
Po uruchomieniu java, ładowana jest klasa "System", która abstrahuje podstawowe pojęcie systemu, w którym działa JVM. W tym czasie są to strumienie wejściowe/wyjściowe/błędów (tzn. Obiekty, do których uzyskujesz dostęp po wpisaniu System.in, System.out, System.err są ustawione w RUNTIME przez ClassLoader, który jest odpowiedzialny za ... klasy loading Java.
W przypadku „system”, ClassLoading to wyrafinowana zadanie, jak sugerujesz, ponieważ konfigurowania systemu klasy (podobnie jak konfigurowania Java Runtime klasa) jest niższy poziom Problem z implementacją JVM jest specyficzny dla systemu operacyjnego:
Jeszcze raz, dla jasności: Mimo że JĘZYK JĘZYKOWY jest niezależny od platformy, JVM dla twojej platformy jest, w przeciwieństwie do języka programowania Java, Środowisko specyficzne dla OS, które tworzy zasoby, które przywołujemy w naszym kodzie dla nas w czasie wykonywania.
Dla lepszego zrozumienia: Sprawdź rzeczywisty kod źródłowy klasy System, jest bardzo czytelny i pozwoli lepiej zrozumieć, co się dzieje. W szczególności, należy spojrzeć na metody nullInputStream():
http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Core/lang/java/lang/System.java.htm