¿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?
Respuesta
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();
}
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();
¿Pero la marca no devuelve valor así que no puedo verificar realmente? –
Pero luego no quieres echar un vistazo, ¿quieres devolver un valor? –
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á. –
BufferedReader br = new BufferedReader(reader);
br.mark(1);
int firstByte = br.read();
br.reset();
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
¡Buena respuesta! Este es el "vistazo" de Java. – Pindatjuh
Vea también: http://stackoverflow.com/a/9198381/59087 –
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();
// ...
}
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".
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.
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;
}
}
}
- 1. ¿Cómo puedo hacer una copia de un BufferedReader?
- 2. ¿Cómo puedo ver un NSError?
- 3. Cierre BufferedReader y System.in
- 4. ¿Problemas con BufferedReader/PrintWriter?
- 5. sockets: BufferedReader readLine (bloques)
- 6. Convertir InputStream en BufferedReader
- 7. ¿Cómo puedo establecer un tiempo de espera contra un BufferedReader basado en un URLConnection en Java?
- 8. lectura en BufferedReader
- 9. Cierre BufferedReader y InputStreamReader
- 10. Java BufferedReader readline blocking?
- 11. ¿Cómo puedo ver un archivo comprimido contenido
- 12. ¿Cómo determinar el estado exacto de un BufferedReader?
- 13. mal uso de los BufferedReader
- 14. ¿Qué espera un constructor de BufferedReader un FileReader
- 15. BufferedReader vs RandomAccessFile en Java
- 16. Diferencia entre BufferedReader y BufferedInputStream
- 17. Como leer más rápido BufferedReader
- 18. Java, sockets, BufferedReader y readline colgar ... :(
- 19. ¿Cómo puedo usar "ver" GDB?
- 20. BufferedReader método listo en un ciclo while para determinar EOF?
- 21. Java BufferedReader volver al principio de un archivo de texto?
- 22. Cómo saber si un flujo BufferedReader está cerrado
- 23. ¿Debo cerrar() tanto FileReader como BufferedReader?
- 24. ¿Por qué utilizar BufferedReader en este caso?
- 25. ¿Cómo ver si un lector está en EOF?
- 26. ¿Cómo puedo ver los primeros dos bytes en un InputStream?
- 27. ¿cómo puedo ver dónde está presente un ejecutable en macosx?
- 28. ¿Cómo puedo ver un preparado Declaración DOP SQL
- 29. ¿Cómo puedo "ver" un archivo para modificación/cambio?
- 30. ¿Cómo puedo ver un objeto con una alerta()
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