Java: leer enteros de un archivo en una matriz

File fil = new File("Tall.txt"); FileReader inputFil = new FileReader(fil); BufferedReader in = new BufferedReader(inputFil); int [] tall = new int [100]; String s =in.readLine(); while(s!=null) { int i = 0; tall[i] = Integer.parseInt(s); //this is line 19 System.out.println(tall[i]); s = in.readLine(); } in.close(); 

Estoy tratando de usar el archivo “Tall.txt” para escribir los enteros contenidos en ellos en la matriz llamada “alto”. Hace esto hasta cierto punto, pero también cuando lo ejecuto arroja la siguiente excepción (:

 Exception in thread "main" java.lang.NumberFormatException: For input string: "" at java.lang.NumberFormatException.forInputString(Unknown Source) at java.lang.Integer.parseInt(Unknown Source) at java.lang.Integer.parseInt(Unknown Source) at BinarySok.main(BinarySok.java:19) 

¿Por qué exactamente hace esto y cómo lo elimino? Según lo veo, leo el archivo como cadenas y luego lo convierto a Ints, lo cual no es ilegal.

Es posible que desee hacer algo como esto (si está en Java 5 y más)

 Scanner scanner = new Scanner(new File("tall.txt")); int [] tall = new int [100]; int i = 0; while(scanner.hasNextInt()){ tall[i++] = scanner.nextInt(); } 

Debe tener una línea vacía en su archivo.

Es posible que desee envolver sus llamadas parseInt en un bloque “try”:

 try { tall[i++] = Integer.parseInt(s); } catch (NumberFormatException ex) { continue; } 

O simplemente verifique las cadenas vacías antes de analizar:

 if (s.length() == 0) continue; 

Tenga en cuenta que al inicializar su variable de índice i dentro del ciclo, siempre es 0. Debe mover la statement antes del ciclo while. (O hazlo parte de un ciclo for ).

A modo de comparación, aquí hay otra forma de leer el archivo. Tiene una ventaja de que no necesita saber cuántos enteros hay en el archivo.

 File file = new File("Tall.txt"); byte[] bytes = new byte[(int) file.length()]; FileInputStream fis = new FileInputStream(file); fis.read(bytes); fis.close(); String[] valueStr = new String(bytes).trim().split("\\s+"); int[] tall = new int[valueStr.length]; for (int i = 0; i < valueStr.length; i++) tall[i] = Integer.parseInt(valueStr[i]); System.out.println(Arrays.asList(tall)); 

Parece que Java está tratando de convertir una cadena vacía en un número. ¿Tienes una línea vacía al final de la serie de números?

Probablemente puedas arreglar el código como este

 String s = in.readLine(); int i = 0; while (s != null) { // Skip empty lines. s = s.trim(); if (s.length() == 0) { continue; } tall[i] = Integer.parseInt(s); // This is line 19. System.out.println(tall[i]); s = in.readLine(); i++; } in.close(); 

Puede tener confusiones entre las diferentes terminaciones de línea. Un archivo de Windows terminará cada línea con un retorno de carro y un avance de línea. Algunos progtwigs en Unix leerán ese archivo como si tuviera una línea en blanco adicional entre cada línea, porque verá el retorno del carro como un final de línea, y luego verá el avance de línea como otro final de línea.

 File file = new File("E:/Responsibility.txt"); Scanner scanner = new Scanner(file); List integers = new ArrayList<>(); while (scanner.hasNext()) { if (scanner.hasNextInt()) { integers.add(scanner.nextInt()); } else { scanner.next(); } } System.out.println(integers);