2010-03-25 25 views
17

¿Hay alguna manera de verificar si en BufferedReader el objeto es algo para leer? Algo así como C++ cin.peek(). Gracias.¿Puedo ver un BufferedReader?

+1

Tengo la sensación de que hay ambigüedad en la mirada de C++ y en la mirada de Java. "comprueba si hay algo para leer" no coincide con "peek" en Java. – BalusC

Respuesta

12

Puede probar el método de "booleano listo()". del documento API de Java 6: "Una secuencia de caracteres almacenados en el búfer está lista si el búfer no está vacío o si la secuencia de caracteres subyacente está lista".

BufferedReader r = new BufferedReader(reader); 
if(r.ready()) 
{ 
    r.read(); 
} 
9

El siguiente código verá el primer byte en el flujo. Debería actuar como un vistazo para ti.

BufferedReader bReader = new BufferedReader(inputStream); 
bReader.mark(1); 
int byte1 = bReader.read(); 
bReader.reset(); 
+0

¿Pero la marca no devuelve valor así que no puedo verificar realmente? –

+0

Pero luego no quieres echar un vistazo, ¿quieres devolver un valor? –

+0

Sí, sí quiero un int peek(). Si hay algo en una transmisión, obtendré la respuesta marcando el valor de retorno, pero el estado de la transmisión no cambiará. –

2
BufferedReader br = new BufferedReader(reader); 
br.mark(1); 
int firstByte = br.read(); 
br.reset(); 
30

Puede usar un PushbackReader. Usando eso puedes leer un personaje, luego leerlo. Esto esencialmente te permite rechazarlo.

PushbackReader pr = new PushbackReader(reader); 
char c = (char)pr.read(); 
// do something to look at c 
pr.unread((int)c); //pushes the character back into the buffer 
+2

¡Buena respuesta! Este es el "vistazo" de Java. – Pindatjuh

+1

Vea también: http://stackoverflow.com/a/9198381/59087 –

4

El lenguaje normal, es comprobar si en un bucle BufferedReader#readLine() no vuelve null. Si se llega al final del flujo (por ejemplo, al final del archivo, socket cerrado, etc.), devuelve null.

E.g.

BufferedReader reader = new BufferedReader(someReaderSource); 
String line = null; 
while ((line = reader.readLine()) != null) { 
    // ... 
} 

Si no desea leer en las líneas (que por cierto es la razón principal de un BufferedReader se ha elegido), a continuación, utilizar BufferedReader#ready() lugar:

BufferedReader reader = new BufferedReader(someReaderSource); 
while (reader.ready()) { 
    int data = reader.read(); 
    // ... 
} 
1

Se puede usar un PushBackReader para leer un personaje, y luego "empujarlo hacia atrás". De esa manera, usted sabe con certeza que algo estaba allí, sin afectar su estado general: un "vistazo".

1

La respuesta de pgmura (confiando en el método ready()) es simple y funciona. Pero tenga en cuenta que es porque la implementación del método por parte de Sun; que realmente no está de acuerdo con la documentación. No confiaría en eso, si este comportamiento es crítico. Ver aquí http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4090471 Prefiero ir con la opción PushbackReader.

0

mi solución fue ... extender BufferedReader y usar la cola como buf, luego puede usar el método peek en la cola.

public class PeekBufferedReader extends BufferedReader{ 

    private Queue<String>  buf; 
    private int     bufSize; 

    public PeekBufferedReader(Reader reader, int bufSize) throws IOException { 
     super(reader); 
     this.bufSize = bufSize; 
     buf = Queues.newArrayBlockingQueue(bufSize); 
    } 

    /** 
    * readAheadLimit is set to 1048576. Line which has length over readAheadLimit 
    * will cause IOException. 
    * @throws IOException 
    **/ 
    //public String peekLine() throws IOException { 
    // super.mark(1048576); 
    // String peekedLine = super.readLine(); 
    // super.reset(); 
    // return peekedLine; 
    //} 

    /** 
    * This method can be implemented by mark and reset methods. But performance of 
    * this implementation is better (about 2times) than using mark and reset 
    **/ 
    public String peekLine() throws IOException { 
     if (buf.isEmpty()) { 
      while (buf.size() < bufSize) { 
       String readLine = super.readLine(); 
       if (readLine == null) { 
        break; 
       } else { 
        buf.add(readLine); 
       } 
      } 
     } else { 
      return buf.peek(); 
     } 
     if (buf.isEmpty()) { 
      return null; 
     } else { 
      return buf.peek(); 
     } 
    } 

    public String readLine() throws IOException { 
     if (buf.isEmpty()) { 
      while (buf.size() < bufSize) { 
       String readLine = super.readLine(); 
       if (readLine == null) { 
        break; 
       } else { 
        buf.add(readLine); 
       } 
      } 
     } else { 
      return buf.poll(); 
     } 
     if (buf.isEmpty()) { 
      return null; 
     } else { 
      return buf.poll(); 
     } 
    } 
    public boolean isEmpty() throws IOException { 
     if (buf.isEmpty()) { 
      while (buf.size() < bufSize) { 
       String readLine = super.readLine(); 
       if (readLine == null) { 
        break; 
       } else { 
        buf.add(readLine); 
       } 
      } 
     } else { 
      return false; 
     } 
     if (buf.isEmpty()) { 
      return true; 
     } else { 
      return false; 
     } 
    } 
} 
Cuestiones relacionadas