Vorab: Ich möchte von mehreren Rechnern auf eine gemeinsame Textdatei im Netzwerk zugreifen und jeweils den Text immer erweitern.
Dazu wäre es ratsam, den Schreibzugriff durch andere Clients zu unterbinden, solang noch Aktivität besteht.
Bislang speichere ich immer mit BufferedWriter(), FileOutputStream() & Co.
Da hab ich mir auf dem NAS mal eine Datei erzeugt, die ich von 2 Instanzen aus aus Netbeans heraus gleichzeitig beschreibe:
Mal von 0-50.000 "Vorwärts" und von 120.000 "Rückwärts" bis 0 gezählt.
Die 50.000 in der zweiten Instanz sind durchgelaufen und alle eingegangen in die Datei, bei den 120.000 der anderen hat es mir grad 2 Exeptions geworfen, weil das Netzwerk ausgelastet ist. Diese 2 Einträge fehlen dann auch (sind nur 119.998 Ergebnisse für "Vorwärts", ggü 50.000 auf "Rückwärts")
das könnte man ja noch abfangen und im Fall einer Exeption dieser Art einfach periodisch mit ner while-Schleife so oft drüber, bis der Speichervorgang abgeschlossen wurde - auf dass es nicht unendlich lange dauert ...
Daher hab ich mir als Alternative eigentlich ergoogelt, dass die Klasse FileChannel() es erlaubt, per .lock() den Schreibzugriff für anderer Clients zu verbieten, während die Datei gerade bearbeitet wird.
Am Beispiel hab ich mich orientiert bei diesen hier:
http://www.java2s.com/Tutorial/Java/0180__File/UsingaChanneltoWriteaStringtoaFile.htm
Das ist der Code, den ich hier dann ausführe:
heraus kommt dann leider etwas mit . oder "null" durchmischtes. Je nach Texteditor ...
Ich werde nicht ganz schlau, wie es zu dem zusätzlichen Zeichen kommt, anstatt mir einfach nur in 2 Zeilen "Test" zu schreiben.
Würde ich mit dem BufferedWriter arbeiten, hätte ich als nächstes wohl auch das Problem, sobald ich die Datei hinterher händisch mitten drin bearbeiten möchte.
Das hab ich wahrscheinlich auch so, weil ich kaum einen Texteditor finden werde, der während ich die Datei am PC geöffnet habe und bearbeite, die ganzen anderen schreibenden Anfragen blockt. Damit müsste ich sämtliche Änderungen vorsichtshalber in einem kleinen extra Programm vornehmen und die Datei dann ebenfalls mit FileChannel() sichern. Soweit so gut für mich verständlich. Das würde ich wohl hinbekommen.
Hat also jemand einen Tipp und Ahnung, was es mit dem Kauderwelsch auf sich hat?
Dazu wäre es ratsam, den Schreibzugriff durch andere Clients zu unterbinden, solang noch Aktivität besteht.
Bislang speichere ich immer mit BufferedWriter(), FileOutputStream() & Co.
Da hab ich mir auf dem NAS mal eine Datei erzeugt, die ich von 2 Instanzen aus aus Netbeans heraus gleichzeitig beschreibe:
Mal von 0-50.000 "Vorwärts" und von 120.000 "Rückwärts" bis 0 gezählt.
Die 50.000 in der zweiten Instanz sind durchgelaufen und alle eingegangen in die Datei, bei den 120.000 der anderen hat es mir grad 2 Exeptions geworfen, weil das Netzwerk ausgelastet ist. Diese 2 Einträge fehlen dann auch (sind nur 119.998 Ergebnisse für "Vorwärts", ggü 50.000 auf "Rückwärts")
das könnte man ja noch abfangen und im Fall einer Exeption dieser Art einfach periodisch mit ner while-Schleife so oft drüber, bis der Speichervorgang abgeschlossen wurde - auf dass es nicht unendlich lange dauert ...
Daher hab ich mir als Alternative eigentlich ergoogelt, dass die Klasse FileChannel() es erlaubt, per .lock() den Schreibzugriff für anderer Clients zu verbieten, während die Datei gerade bearbeitet wird.
Am Beispiel hab ich mich orientiert bei diesen hier:
http://www.java2s.com/Tutorial/Java/0180__File/UsingaChanneltoWriteaStringtoaFile.htm
Das ist der Code, den ich hier dann ausführe:
Java:
package FileChannelModus;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
*
* @author zerstreuterprof
*/
public class LaufendSchreiben {
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws InterruptedException {
// TODO code application logic here
int count = 0;
FileChannel outChannel;
while (count < 2) {
count++;
StringBuilder sb = new StringBuilder();
Date time = Calendar.getInstance().getTime();
DateFormat formatter = new SimpleDateFormat();
// Format 26.04.10 18:11
String sSimpleDateTime = (formatter.format(time));
sb.append(sSimpleDateTime);
sb.append("\n");
try {
//String phrase = new String(sb.toString());
String phrase = new String("Test\n");
FileOutputStream outputFile = null;
try {
outputFile = new FileOutputStream("D:\\test.txt", true);
System.out.println("File stream created successfully.");
} catch (FileNotFoundException e) {
e.printStackTrace(System.err);
}
outChannel = outputFile.getChannel();
outChannel.lock();
ByteBuffer buf = ByteBuffer.allocate(1024);
System.out.println("New buffer: position = " + buf.position() + "\tLimit = " + buf.limit() + "\tcapacity = " + buf.capacity());
for (char ch : phrase.toCharArray()) {
buf.putChar(ch);
}
System.out.println("Buffer after loading: position = " + buf.position() + "\tLimit = " + buf.limit() + "\tcapacity = " + buf.capacity());
buf.flip();
System.out.println("Buffer after flip: position = " + buf.position() + "\tLimit = " + buf.limit() + "\tcapacity = " + buf.capacity());
try {
outChannel.write(buf);
outputFile.close();
System.out.println("Buffer contents written to file.");
} catch (IOException e) {
e.printStackTrace(System.err);
}
} catch (Exception e) {
}
Thread.sleep(5000);
}
}
}
heraus kommt dann leider etwas mit . oder "null" durchmischtes. Je nach Texteditor ...
Ich werde nicht ganz schlau, wie es zu dem zusätzlichen Zeichen kommt, anstatt mir einfach nur in 2 Zeilen "Test" zu schreiben.
Würde ich mit dem BufferedWriter arbeiten, hätte ich als nächstes wohl auch das Problem, sobald ich die Datei hinterher händisch mitten drin bearbeiten möchte.
Das hab ich wahrscheinlich auch so, weil ich kaum einen Texteditor finden werde, der während ich die Datei am PC geöffnet habe und bearbeite, die ganzen anderen schreibenden Anfragen blockt. Damit müsste ich sämtliche Änderungen vorsichtshalber in einem kleinen extra Programm vornehmen und die Datei dann ebenfalls mit FileChannel() sichern. Soweit so gut für mich verständlich. Das würde ich wohl hinbekommen.
Hat also jemand einen Tipp und Ahnung, was es mit dem Kauderwelsch auf sich hat?