Ответом будет «нет» ... и «да». Кажется, нет никакого реального способа узнать, открыт ли файл для записи другим приложением. Таким образом, чтение из такого файла будет продолжаться до тех пор, пока содержимое не будет исчерпано. Я воспользовался советом Майка и написал тестовый код:
Writer.java записывает строку в файл, а затем ждет, пока пользователь нажмет клавишу ввода, прежде чем записать другую строку в файл. Идея в том, что он может быть запущен, а затем можно запустить читатель, чтобы увидеть, как он справляется с «частичным» файлом. Читатель, который я написал, находится в Reader.java.
Writer.java
public class Writer extends Object
{
Writer () {
}
public static String[] strings =
{
"Hello World",
"Goodbye World"
};
public static void main(String[] args)
throws java.io.IOException {
java.io.PrintWriter pw =
new java.io.PrintWriter(new java.io.FileOutputStream("out.txt"), true);
for(String s : strings) {
pw.println(s);
System.in.read();
}
pw.close();
}
}
Reader.java
public class Reader extends Object
{
Reader () {
}
public static void main(String[] args)
throws Exception {
java.io.FileInputStream in = new java.io.FileInputStream("out.txt");
java.nio.channels.FileChannel fc = in.getChannel();
java.nio.ByteBuffer bb = java.nio.ByteBuffer.allocate(10);
while(fc.read(bb) >= 0) {
bb.flip();
while(bb.hasRemaining()) {
System.out.println((char)bb.get());
}
bb.clear();
}
System.exit(0);
}
}
Нет гарантий, что этот код является наилучшей практикой.
Это оставляет вариант, предложенный Майком, периодически проверять, есть ли новые данные для чтения из файла. Затем требуется вмешательство пользователя для закрытия программы чтения файлов, когда определено, что чтение завершено. Или читатель должен быть осведомлен о содержимом файла и уметь определять и конец условия записи. Если бы содержимое было XML, конец документа мог бы использоваться для обозначения этого.