Hallo Forum,
ich habe mehrere Prozesse die auf eine und dieselbe Datei erstellen/zugreifen.
Es ist eine *.cvs Datei für OpenOffice Tabellencalculation.
Die Dateinamen sind individualisiert, also mit Zeitstempel versehen, sodass alle beispielsweise in der ersten Minute auf Datei "example-1.cvs" zugreifen in der zweiten Minute auf "example-2.cvs" usw.
Also der erste Prozess, der diese Datei braucht, soll diese erstellen. Wenn ein anderer Prozess diese Datei schon erstellt hat, soll dieser Prozess zugreifen können. --> also jeder Prozess ruft dazu folgenden createCVS(i) auf.
Dann schreibt jeder, wenn er was zu loggen hat, eine neue Zeile mit seinen Daten..
Wenn dann die aktuelle minute vorbei ist rufen alle:
Es läuft noch nicht so ganz sauber ab.
Habe mir überlegt, ob es sync Probleme geben könnte?
Oder wird das von der JVM alles gehandled?
Gibt es vlt. eine geeignetere zB StreamWriterSynced Klasse? (Kenne nicht alle auswändig)
Wenn mal bei einem Prozess die closeCVS Methode nicht aufgerufen wird kann es doch murks geben?
Wäre es dann sinnvoller, wenn jeder Prozess, wenn er denn eine Zeile hinzufügen möchte, jedesmal (!) createCVS() auruft, mit addRowCVS() seine Zeile zufügt, und sofort mit closeCVS den Strom schlieest. Wenn er in die gleiche Datei nochmal schreiben müsste, jedesmal alles von vorne? Unnötig?
Ich danke im voraus und mfg Huck!
ich habe mehrere Prozesse die auf eine und dieselbe Datei erstellen/zugreifen.
Es ist eine *.cvs Datei für OpenOffice Tabellencalculation.
Die Dateinamen sind individualisiert, also mit Zeitstempel versehen, sodass alle beispielsweise in der ersten Minute auf Datei "example-1.cvs" zugreifen in der zweiten Minute auf "example-2.cvs" usw.
Also der erste Prozess, der diese Datei braucht, soll diese erstellen. Wenn ein anderer Prozess diese Datei schon erstellt hat, soll dieser Prozess zugreifen können. --> also jeder Prozess ruft dazu folgenden createCVS(i) auf.
Java:
//.. zB konstuktor
File currentCVSF = null;
FileWriter currentRegionCVSFW = null;
//..
public void createCVS(long cTime){
String RFOLDER = "/verzeichnis";
try {
this.currentCVSF = new File(RFOLDER,"Tabelle-"+cTime+".cvs");
this.currentCVSFW = new FileWriter(currentCVSF, true);
if (currentCVSF.length() == 0) {
currentCVSFW.write(
"Spalte_1;" +
"Spalte_2;" +
"Spalte_3;" +
"Spalte_4;" +
"Spalte_5;" +
"Spalte_6;\n");
}
currentCVSFW.flush();
} catch (Exception e) {
System.out.println("*** Exception GroupFile"+e);
}
}
Java:
public void addRowCVS(String ac, long cTime){
try {
String szT = "";
szT += TimeUnit.NANOSECONDS.toMillis(aObj.getCurrentTime())+";" ;
szT += ac.concat(";");
szT += String.valueOf( this.getData1 ).concat(";");
szT += String.valueOf( this.getData2 ).concat(";");
szT += String.valueOf( this.getData3 ).concat(";\n");
currentRegionCVSFW.write(szT);
currentRegionCVSFW.flush();
} catch (Exception e) {
System.out.println("*** Exception: "+e);
}
}
Java:
public void closeCVS(){
try {
this.currentCVSFW.flush(); // Falls noch was im Stream ist, flushen()
this.currentCVSF = null; // Sauber machen
this.currentCVSFW.close(); // closen()
} catch (Exception e) {
System.out.println("*** Exception on close(): "+e);
}
}
Es läuft noch nicht so ganz sauber ab.
Habe mir überlegt, ob es sync Probleme geben könnte?
Oder wird das von der JVM alles gehandled?
Gibt es vlt. eine geeignetere zB StreamWriterSynced Klasse? (Kenne nicht alle auswändig)
Wenn mal bei einem Prozess die closeCVS Methode nicht aufgerufen wird kann es doch murks geben?
Wäre es dann sinnvoller, wenn jeder Prozess, wenn er denn eine Zeile hinzufügen möchte, jedesmal (!) createCVS() auruft, mit addRowCVS() seine Zeile zufügt, und sofort mit closeCVS den Strom schlieest. Wenn er in die gleiche Datei nochmal schreiben müsste, jedesmal alles von vorne? Unnötig?
Ich danke im voraus und mfg Huck!