Perché System.out / err sono implementati come Byte Streams in Java?
Domanda
Stavo dando un'occhiata a questo tutorial su Sun sulla riga di comando I / O. Ha dichiarato che:
Potresti aspettarti i flussi standard essere flussi di personaggi, ma, per ragioni storiche, sono byte i flussi. System.out e System.err sono definito come oggetti PrintStream. Anche se tecnicamente è un byte stream, PrintStream utilizza un oggetto flusso di caratteri interno a emulare molte delle funzionalità di flussi di personaggi.
Qualcuno sa quali sono le "ragioni storiche" sono?
Soluzione
Le "ragioni storiche" sono che i flussi di caratteri non esistevano in Java 1.0. Apparentemente Sun si è reso conto che il modello di traduzione dei personaggi era insufficiente e la gerarchia di classi Reader / Writer orientata ai personaggi è stata aggiunta in Java 1.1.
Ma era troppo tardi per System.out e gli amici.
Altri suggerimenti
Immagino che il motivo sia di essere retrocompatibile con l'I / O standard POSIX C / C ++, in cui stdin, stdout e stderr (l'equivalente C / C ++ di System.in, System.out e System .err rispettivamente) sono flussi di byte. In Windows, questi flussi eseguono la traduzione CRLF, ma nei sistemi POSIX non si verificano tali conversioni e puoi leggere e scrivere liberamente dati binari non di carattere. Molte utility Unix lo fanno, come gzip
e tar
di GNU.
Ricorda che i personaggi in Java usano un carattere Unicode a 16 bit. L'originale System.in etc doveva essere compatibile con gli ambienti che supportavano Java, che (all'epoca di Dawn of Time) spesso non supportava Unicode. Ciò, insieme al trattamento fastidiosamente disparato delle estremità delle linee, significava che i flussi di byte erano l'unico tipo che aveva la stessa semantica, indipendentemente dalla piattaforma.