studio - como calcular la edad de una persona en años meses y dias en java
¿Puedo echar un vistazo a un BufferedReader? (8)
El idioma normal es comprobar en un bucle si BufferedReader#readLine()
no devuelve null
. Si se llega al final de la transmisión (por ejemplo, final del archivo, socket cerrado, etc.), devuelve un null
.
P.ej
BufferedReader reader = new BufferedReader(someReaderSource);
String line = null;
while ((line = reader.readLine()) != null) {
// ...
}
Si no desea leer en líneas (lo cual es la principal razón por la que se eligió un BufferedReader
), entonces use BufferedReader#ready()
BufferedReader reader = new BufferedReader(someReaderSource);
while (reader.ready()) {
int data = reader.read();
// ...
}
¿Hay alguna forma de verificar si en el objeto BufferedReader
hay algo para leer? Algo como C ++ cin.peek()
. Gracias.
El siguiente código mirará el primer byte en la secuencia. Debería actuar como un vistazo para ti.
BufferedReader bReader = new BufferedReader(inputStream);
bReader.mark(1);
int byte1 = bReader.read();
bReader.reset();
La respuesta de pgmura (confiar en el método ready ()) es simple y funciona. Pero tenga en cuenta que se debe a que Sun implementó el método; Lo que realmente no está de acuerdo con la documentación. No confiaría en eso, si este comportamiento es crítico. Consulte 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;
}
}
}
Puede utilizar un PushbackReader . Usando eso puedes leer un personaje, luego des-leerlo. Esto esencialmente le permite empujarlo hacia atrás.
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
Puedes probar el método "boolean ready ()". De la documentación de la API de Java 6: "Un flujo de caracteres en búfer está listo si el búfer no está vacío, o si el flujo de caracteres subyacente está listo".
BufferedReader r = new BufferedReader(reader);
if(r.ready())
{
r.read();
}
Puedes usar un PushBackReader
para leer un personaje, y luego "empujarlo". De esa manera, estará seguro de que algo estaba allí, sin afectar su estado general: un "vistazo".
BufferedReader br = new BufferedReader(reader);
br.mark(1);
int firstByte = br.read();
br.reset();