2011-11-30 11 views
16

Estoy escribiendo un programa en Java y una de las cosas que tengo que hacer es crear un conjunto de cada ubicación válida para un problema de ruta más corta. Las ubicaciones se definen en un archivo .txt que sigue un patrón estricto (una entrada por línea, sin espacios en blanco adicionales) y es perfecto para usar .nextLine para obtener los datos. Mi problema es que 241 líneas en el archivo (de 432) el escáner deja de funcionar 3/4 del camino a través de una entrada y no reconoce ninguna línea nueva.El escáner de Java no pasa por el archivo completo

Mi código:

//initialize state space 
private static Set<String> posible(String posLoc) throws FileNotFoundException { 
    Scanner s = new Scanner(new File(posLoc)); 
    Set<String> result = new TreeSet<String>(); 
    String availalbe; 
    while(s.hasNextLine()) { 
     availalbe = s.nextLine(); 
     result.add(availalbe); 
    } 
    s.close(); 
    return result; 
} 

Los Datos

Shenlong Gundam 
Altron Gundam 
Tallgee[scanner stops reading here]se 
Tallgeese II 
Leo (Ground) 
Leo (Space) 

Por supuesto, "escáner deja de leer aquí" no se encuentra en los datos, sólo estoy marcado con la que el escáner deja de leer el archivo. Esto tiene 3068 bytes en el archivo, pero eso no debería afectar nada porque en el mismo programa, con código casi idéntico, estoy leyendo un archivo .txt de 261 líneas y 14 KB que codifica las rutas. Cualquier ayuda sería apreciada.

Gracias.

+1

¿Podría cargar el archivo de datos real en algún lugar donde podamos echarle un vistazo? – NPE

+1

¿Hay excepciones lanzadas? ¿Hay bloques de captura vacíos? –

+0

Espero que pastebin funcione para todos. [datos] (http://pastebin.com/rt3mbXtD) – Fizzmaister

Respuesta

15

Hay un problema con Scanner al leer su archivo, pero no estoy seguro de qué se trata. Cree erróneamente que se ha llegado al final del archivo cuando no lo ha hecho, posiblemente debido a una codificación funky String. Intente utilizar un objeto BufferedReader que en su lugar ajuste un objeto FileReader.

por ejemplo,

private static Set<String> posible2(String posLoc) { 
     Set<String> result = new TreeSet<String>(); 
     BufferedReader br = null; 
     try { 
     br = new BufferedReader(new FileReader(new File(posLoc))); 
     String availalbe; 
     while((availalbe = br.readLine()) != null) { 
      result.add(availalbe);    
     } 
     } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } finally { 
     if (br != null) { 
      try { 
       br.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     } 
     return result; 
    } 

Editar
intenté reducir el problema a su mínima expresión, y justo esto fue suficiente para provocar el problema:

public static void main(String[] args) { 
     try { 
     Scanner scanner = new Scanner(new File(FILE_POS)); 
     int count = 0; 
     while (scanner.hasNextLine()) { 
      String line = scanner.nextLine(); 
      System.out.printf("%3d: %s %n", count, line); 
      count++; 
     } 

he comprobado el objeto del escáner con un printf:

System.out.printf("Str: %-35s size%5d; Has next line? %b%n", availalbe, result.size(), s.hasNextLine()); 

y mostró que pensaba que el archivo había terminado. Estaba en proceso de borrar progresivamente las líneas de los datos al archivo para ver qué línea (s) causó el problema, pero se lo dejo a usted.

+0

Gracias, funcionó. No tengo idea de qué pasa con el escáner, pero eso lo lee todo. – Fizzmaister

+0

@Fizzmaister: ver edición. –

+3

Y así nunca lo sabremos. :/ – Bryan

4

Estaba teniendo el mismo problema. El escáner no leería hasta el final de un archivo, realmente se detendría justo en el medio de una palabra. Pensé que era un problema con algún límite establecido en el escáner, pero tomé nota del comentario de Rfeak sobre la codificación de caracteres.

He vuelto a guardar el .txt Estaba leyendo en UTF-8, se resolvió el problema. Resulta que el Bloc de notas había predeterminado a ANSI.

-1

Debe utilizar este:

escáner Escáner = nuevo escáner (fileObj) .useDelimiter ("\ z");
System.out.println (scanner.next());

+1

Esto ni siquiera compila, y si lo corrigió para compilar, no se acerca a resolver este problema. – wvdz

6

me encontré con el mismo problema y esto es lo que hice para solucionarlo:

1.Saved the file I was reading from into UTF-8 
2.Created new Scanner like below, specifying the encoding type: 


    Scanner scanner = new Scanner(new File("C:/IDSBRIEF/GuidData/"+sFileName),"UTF-8"); 
+0

Esto resolvió mi problema. Básicamente mi escáner suponía una codificación, mientras que Notepad ++ asumía otra. Cuando especifiqué la misma codificación en ambos lugares, mi problema fue resuelto. –

+0

Esta parte resolvió mi problema:), "UTF-8"); ¡Gracias! –

0

que tenía un archivo txt en el que dejó de leer escáner en la línea 862, que era un problema extraño. Lo que hice fue crear un archivo diferente (para tratar de replicar el problema). Primero lo agregué a menos de 862 líneas, luego agregué más de 862 y funcionó bien.

Así que creo que el problema fue que en mi archivo anterior, en la línea 862, había algo mal, como algún carácter o símbolo que podría haber confundido a Scanner para terminar de leer antes.

En conclusión: en base a esta experiencia recomiendo encontrar la línea exacta donde el escáner deja de leer para encontrar una solución para el tipo de problemas.

Cuestiones relacionadas