У меня есть программа Writer, которая записывает одну строку текста в файл, а затем ждет, пока пользователь не вернется назад, прежде чем он напишет другую строку, а затем выйдет. Только после этого файл закрыт. Код:Почему FileInputStream read() не блокирует?
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();
}
}
Старта первого с:
Java Writer
Тогда у меня есть читательская программа, которая должна (ну я ожидал) блокировать до тех пор, написание файл еще не завершен (т. е. pw.close() еще не был вызван). Код:
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");
}
}
Начать с:
ява ReaderFIS
Теперь я ожидал чтения(), чтобы блокировать после прочтения первого "Hello World" текст, основанный на этом в Документация Javadoc:
Считывает байт данных из этого входного потока. Этот метод блокирует, если вход еще не доступен. Via: http://docs.oracle.com/javase/6/docs/api/java/io/FileInputStream.html#read()
Но ReaderFIS немедленно сделано после прочтения "Hello World" и, видимо, видит EOF! Так что не блок! Он сбрасывает значения символов, затем -1, а затем печатает «выход».
Выход: ч = 72 ч = 101 ч = 108 ч = 108 ч = 111 ч = 32 ч = 87 ч = 111 ч = 114 ч = 108 ч = 100 Последней ч = -1 , выходящий
других вариантов мною опробован были: чтение через GetChannel(), проверку через GetChannel(), если это может быть блокировка() ред, используя имеющейся(), стараясь прочитать() с использованием buffer, пытающийся readLine(), непрерывно записывая char acter в файле с паузой в 500 мсек между каждой записью, а не записью ничего, просто сохраняя файл открытым в Writer.
Ни один из этих вариантов не приводит к блокировке программы ReaderFIS, она всегда заканчивается.
Почему программа чтения не блокирует? Неужели я пропустил что-то такое, что очень очевидно? Кажется, программа ReaderFIS находит EOF (-1), но почему? Файл еще не был закрыт программой Writer.
"Funny" sidenote: System.in.read() блокирует! (и ждет, пока пользователь нажмет Enter).
PS: попробовал это на Windows XP и Suse Linux. В Windows я не могу удалить файл во время работы сценария (как и ожидалось).
С уважением, Marco
Когда вы пишете на диск, вы вынуждаете EOF, нет? EOF только перемещается при добавлении новой информации. Но блок на диске должен иметь EOF ... – jcolebrand
Итак, вы говорите, что EOF * всегда * написан, потому что файл всегда нужен. Но я думал, что EOF записывается только после завершения промывки и закрытия файла. Но это означает, что мой read() никогда не будет блокироваться при чтении файла, потому что всегда есть * EOF и всегда возвращает -1, даже если файл пуст. Так неправильный JavaDoc? – QQQuestions