usando java.util.Scanner para leer un byte de archivo por byte

Intento leer un archivo de una línea caracter por carácter usando java.util.Scanner. Sin embargo, estoy obteniendo esta excepción “:

Exception in thread "main" java.util.InputMismatchException: For input string: "contents of my file" at java.util.Scanner.nextByte(Scanner.java:1861) at java.util.Scanner.nextByte(Scanner.java:1814) at p008.main(p008.java:18) <-- line where I do scanner.nextByte() 

Aquí está mi código:

 public static void main(String[] args) throws FileNotFoundException { File source = new File("file.txt"); Scanner scanner = new Scanner(source); while(scanner.hasNext()) { System.out.println((char)scanner.nextByte()); } scanner.close() } 

¿Alguien tiene alguna idea de lo que podría estar haciendo mal?

Editar: me di cuenta de que escribí hasNext () en lugar de hasNextByte (). Sin embargo si hago eso no imprime nada.

¿Por qué demonios querría usar un escáner para leer un byte a byte de un archivo? Es como usar una carretilla para transportar su cambio de bolsillo. (Si realmente necesita una carretilla para cambiar su bolsillo, hágamelo saber para que pueda ser su amigo).

Pero en serio: Class InputStream lee bytes de un archivo, de manera simple y confiable, y no hace nada más.

El scanner clases se introdujo recientemente en la API de Java, por lo que los ejemplos de libros de texto podrían extraer datos de un archivo con menos dolor de lo que suele implicar el uso de la cascada del new BufferedReader(new InputStream) . Su especialidad es ingresar números y cadenas de archivos de entrada de forma libre. El método nextByte() realmente lee uno o algunos dígitos decimales de la secuencia de entrada (si están allí) y convierte el número así escaneado en un valor de byte único.

Y si estás leyendo bytes, ¿por qué quieres mostrarlos como caracteres? Los bytes no son caracteres, y la interconversión de fuerza bruta fallará en algunos lugares. Si desea ver los valores de esos bytes, imprímalos tal como son y verá números enteros pequeños entre 0 y 255.

Si desea leer caracteres de un archivo, FileReader es la clase para usted.

Scanner es para analizar datos de texto; su método nextByte() espera que la entrada consista en dígitos (posiblemente precedidos por un signo).

Probablemente desee usar un FileReader si en realidad está leyendo datos de texto, o un FileInputStream si son datos binarios. O un FileInputStream en un InputStreamReader si está leyendo texto con una encoding de caracteres específica (desafortunadamente, FileReader no le permite especificar la encoding, pero usa la encoding predeterminada de la plataforma de manera implícita, lo que a menudo no es bueno).

Al solucionar problemas con el Scanner , compruebe si hay errores de E / S subyacentes :

 if(scanner.ioException() != null) { throw scanner.ioException(); } 

Aunque estoy con los demás, probablemente esta no sea la clase adecuada para el trabajo. Si quiere entrada de bytes, use un InputStream (en este caso, FileInputStream ). Si desea una entrada de caracteres, use un Reader (por ejemplo, InputStreamReader ).

Scanner tiene que ver con la lectura de texto delimitado (consulte la documentación ).

nextByte seguirá leyendo hasta que llegue al delimitador que hayas especificado (espacio en blanco por defecto) y luego intenta convertir esa cadena en un byte.

Entonces, si tiene 123 456 en un archivo, una llamada a nextByte devolverá 123 , no 49 (el valor decimal para el 1 carácter).


Si desea leer byte a byte, puede usar FileInputStream .