2010-01-11 27 views
5

Estoy tratando de leer un carácter de un carácter de línea usando java.util.Scanner. Sin embargo, yo estoy haciendo esta excepción ":usando java.util.Scanner para leer un byte de archivo por byte

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 escribió hasNext() en lugar de hasNextByte(). Sin embargo, si lo hago, no se imprime nada.

+6

a Scanner es para analizar la entrada de caracteres. Sospecho que necesitas un InputStream. –

Respuesta

10

¿Por qué querría usar un escáner para leer un byte de archivo por byte? Es como usar una ruedab flecha 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: la clase InputStream lee bytes de un archivo, de manera sencilla y confiable, y no hace nada más.

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

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

Si desea leer char s de un archivo, FileReader es la clase para ti .

+0

Tengo un archivo de texto que comienza con la palabra "Resumen" (qué sorpresa ...). De todos modos, cuando intento leer con: Scanner scanner = new Scanner (file); byte b = scanner.nextByte(); Estoy obteniendo java.util.InputMismatchException. ¿Por qué no veo ningún valor entre 0 y 255? ¿Pueden ayudarme? El archivo es UTF-8. –

+0

Mi respuesta lo explicó, pero quizás no muy bien. ¡El escáner lee e interpreta la entrada de texto, no los bytes de bajo nivel! Intente crear un archivo cuya primera línea muestre '1 10 100 1000 hola' y lea eso con' Scanner.nextByte() '. Leerá con éxito y devolverá como bytes los números 1, 10 y 100 pero sufrirá una excepción en 1000 y (si lee más allá) en "hola" porque esos no son valores que se pueden representar en un byte. –

2

Escáner es para análisis datos de texto - su método nextByte() espera que la entrada consista en dígitos (posiblemente precedida por un signo).

Es probable que desee utilizar un FileReader si realmente está leyendo datos de texto, o un FileInputStream si se trata de datos binarios. O un FileInputStream envuelto en un InputStreamReader si está leyendo texto con una codificación de caracteres específica (desafortunadamente, FileReader no le permite especificar la codificación, pero usa la codificación predeterminada de la plataforma implícitamente, que a menudo no es buena).

+0

Disculpe, ¿qué quiere decir "analizar datos de texto" y "leer datos de texto"? –

+0

@KorayTugay: leer significa simplemente tomar lo que venga, un byte (o carácter) tras otro. El análisis significa que espera que los datos tengan una estructura o formato específico, como una cadena que consta de dígitos precedidos por un signo menos opcional, para que pueda interpretarlo como un número. –

+0

Gracias por el comentario. ¿Entonces el método nextByte en la clase Scanner es solo para "leer dígitos"? –

1

Al solucionar Scanner, la verificación de underlying I/O errors:

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

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

1

Scanner consiste en leer texto delimitado (ver the docs).

nextByte seguirá leyendo hasta que llegue al delimitador que haya especificado (espacios en blanco de forma predeterminada) y luego intente convertir esa cadena en un byte.

Así que si usted tiene 123 456 en un archivo, una llamada a nextByte volverá 123, no 49 (el valor decimal para el personaje 1).


Si desea leer el byte a byte, se puede usar FileInputStream.

Cuestiones relacionadas