Tengo un programa Writer que escribe una línea de texto en un archivo, luego espera hasta que el usuario toque return antes de escribir otra línea y luego salir. Solo después de eso se cierra el archivo. El código:¿Por qué FileInputStream read() no bloquea?
public class Writer {
Writer() {
}
public static String[] strings =
{
"Hello World",
"Goodbye World"
};
public static void main(String[] args)
throws java.io.IOException {
java.io.FileOutputStream pw =
new java.io.FileOutputStream("myfile.txt");
for(String s : strings) {
pw.write(s.getBytes());
System.in.read();
}
pw.close();
}
}
de inicio por primera vez con:
java escritor
Entonces también tengo un programa lector que debería (así lo esperaba) bloquean el tiempo que la redacción de la el archivo no ha terminado aún (es decir, pw.close() aún no se ha llamado). El código:
public class ReaderFIS extends Object {
ReaderFIS() {
}
public static void main(String[] args) throws Exception {
java.io.FileInputStream in = new java.io.FileInputStream("myfile.txt");
int ch = -1;
while((ch = in.read()) >= 0) {
System.out.println("ch = " + ch);
}
System.out.println("Last ch = " + ch);
System.out.println("exiting");
}
}
Inicio con:
ReaderFIS java
Ahora que esperaba la lectura() para bloquear después de leer el primer texto "Hello World", en base a esto en la documentación de Javadoc:
Lee un byte de datos de esta secuencia de entrada. Este método bloquea si aún no hay entradas disponibles. Vía: http://docs.oracle.com/javase/6/docs/api/java/io/FileInputStream.html#read()
Pero el ReaderFIS se realiza inmediatamente después de leer "Hello World" y aparentemente ve un EOF! ¡Así que hace no el bloque! Vacia los valores de caracteres, luego a -1 y luego imprime "salir".
de salida: ch = 72 ch = 101 ch = 108 ch = 108 ch = 111 ch = 32 ch = 87 ch = 111 ch = 114 ch = 108 ch = 100 Última ch = -1 salir
Otras variaciones que probamos eran: la lectura a través de un getChannel(), el control a través de getChannel() si puede ser de bloqueo() ed, utilizando disponible(), intentando leer() usando una buffer, intentando readLine(), escribiendo continuamente un char Acceda al archivo con una pausa de 500 ms entre cada escritura, sin escribir nada, solo manteniendo el archivo abierto en Writer.
Ninguna de estas variaciones hace que el programa ReaderFIS se bloquee, siempre termina.
¿Por qué el programa lector no bloquea? ¿Extrañé algo tan tan obvio? Parece que el programa ReaderFIS encuentra un EOF (-1), pero ¿por qué? El programa no ha sido cerrado aún por el programa Writer.
Nota al margen "graciosa": el System.in.read() está bloqueando. (y esperando que el usuario presione Enter).
PD: intenté esto en Windows XP y Suse Linux. En Windows no puedo borrar el archivo mientras el escritor se está ejecutando (que es como esperaba).
Saludos, Marco
cuando escribe en disco, fuerza un EOF, ¿no? el EOF solo se mueve al agregar información nueva. Pero el bloque en el disco tiene que tener un EOF ... – jcolebrand
Así que está diciendo que el EOF está * siempre * escrito porque un archivo siempre necesita uno. Pero pensé que un EOF solo se escribe al final después de enjuagar y cerrar el archivo. Pero eso significa que mi lectura() nunca se bloqueará cuando lea un archivo porque siempre hay * un * EOF y siempre devuelve un -1 incluso si el archivo está vacío. Entonces, ¿el JavaDoc es incorrecto? – QQQuestions