Wydaje się, że odpowiedź brzmi „nie”… i „tak”. Wydaje się, że nie ma prawdziwego sposobu sprawdzenia, czy plik jest otwarty do zapisu w innej aplikacji. Tak więc czytanie z takiego pliku będzie kontynuowane do wyczerpania zawartości. Posłuchałem rady Mike'a i napisałem kod testowy:
Writer.java zapisuje ciąg do pliku, a następnie czeka, aż użytkownik naciśnie klawisz Enter, zanim zapisze kolejną linię do pliku. Chodzi o to, że można go uruchomić, a następnie czytelnik może zacząć zobaczyć, jak radzi sobie z plikiem „częściowym”. Czytelnik, którego napisałem, znajduje się w 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);
}
}
Nie ma gwarancji, że ten kod jest najlepszymi praktykami.
Pozostawia to sugerowaną przez Mike'a opcję okresowego sprawdzania, czy z pliku są nowe dane do odczytania. Następnie wymaga to interwencji użytkownika w celu zamknięcia czytnika plików, gdy zostanie ustalone, że odczyt jest zakończony. Lub czytelnik musi być świadomy zawartości pliku i być w stanie określić i zakończyć zapis. Gdyby treść była w formacie XML, można by to zasygnalizować na końcu dokumentu.