La mayoría de las respuestas aquí proponen atajos, que pueden traerle grandes problemas si no tiene idea de lo que está haciendo. Si desea tomar atajos, debe saber exactamente en qué codificación se encuentran sus datos.
UTF-16
Siempre que java habla de caracteres en su documentación, habla de caracteres de 16 bits.
Puede utilizar a DataInputStream, que tiene métodos convenientes. Para mayor eficiencia, envuélvalo en un BufferedReader.
// e.g. for sockets
DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
char character = readChar(); // no need to cast
El caso es que cada uno readChar()realmente ejecutará 2 ready los combinará en un carácter de 16 bits.
US-ASCII
US-ASCII reserva 8 bits para codificar 1 carácter. Sin embargo, la tabla ASCII solo describe 128 caracteres posibles, por lo que 1 bit siempre está sin usar.
En este caso, simplemente puede realizar un yeso.
int input = stream.read();
if (input < 0) throw new EOFException();
char character = (char) input;
ASCII extendido
UTF-8, Latin-1, ANSI y muchas otras codificaciones utilizan todos los 8 bits. Los primeros 7 bits siguen la tabla ASCII y son idénticos a los de la codificación US-ASCII. Sin embargo, el octavo bit ofrece caracteres que son diferentes en todas estas codificaciones. Entonces, aquí las cosas se ponen interesantes.
Si eres un vaquero y crees que el octavo bit no importa (es decir, no te importan los personajes como "à, é, ç, è, ô ...) entonces puedes salirte con la tuya con un elenco simple.
Sin embargo, si desea hacer esto de manera profesional, debe especificar SIEMPRE un juego de caracteres cada vez que importe / exporte texto (por ejemplo, sockets, archivos ...).
Utilice siempre juegos de caracteres
Pongámonos serios. Todas las opciones anteriores son trucos baratos. Si desea escribir software flexible, debe admitir un juego de caracteres configurable para importar / exportar sus datos. Aquí tienes una solución genérica:
Lea sus datos usando un byte[]búfer y conviértalo a String usando un parámetro de juego de caracteres .
byte[] buffer = new byte[1024];
int nrOfBytes = stream.read(buffer);
String result = new String(buffer, nrOfBytes, charset);
También puede usar un InputStreamReaderque se puede instanciar con un parámetro charset.
Solo una regla de oro más: nunca envíes directamente un byte a un personaje. Eso es siempre un error.
public int read(char[] cbuf)resolverá el problema?