A resposta parece ser "não" ... e "sim". Parece não haver uma maneira real de saber se um arquivo está aberto para gravação por outro aplicativo. Portanto, a leitura desse arquivo irá apenas progredir até que o conteúdo se esgote. Segui o conselho de Mike e escrevi alguns códigos de teste:
Writer.java grava uma string no arquivo e, em seguida, espera que o usuário pressione Enter antes de gravar outra linha no arquivo. A ideia é que ele possa ser iniciado, então um leitor pode ser iniciado para ver como ele lida com o arquivo "parcial". O leitor que escrevi está em 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);
}
}
Não há garantias de que este código seja a prática recomendada.
Isso deixa a opção sugerida por Mike de verificar periodicamente se há novos dados a serem lidos do arquivo. Isso exige a intervenção do usuário para fechar o leitor de arquivos quando for determinado que a leitura foi concluída. Ou, o leitor precisa estar ciente do conteúdo do arquivo e ser capaz de determinar a condição de fim de gravação. Se o conteúdo fosse XML, o final do documento poderia ser usado para sinalizar isso.