Ich habe mal ne Frage zu den Properties in Java...
Darin kann man ja Werte speichern, mit Angabe von Schlüsseln...soweit ich weiß...
nun soll es möglich sein durch diese Properties Werte hintereinander abzuspeichern, ohne zu überschreiben...
Genauer: Nach jedem Aufruf des Java-Programms wird diese Variable neu generiert (im Minuten - Takt), jeder Wert dieser Variable soll hintereinander in der Properties Datei gespeichert werden... nachdem 60 Werte gespeichert wurden soll damit gerechnet werden, danach sollen die Einträge wieder gelöscht werden aus der Liste und es soll von vorn los gehen...
Ich habe wirklich keine Ahnung wie ich dies umsetzen könnte...wäre super wenn jemand eine Idee hätte... mit Sourcecode wäre schön...
Was willst Du denn genau machen ? Denn ich denke nicht, das das Property Konzept für solche Sachen gedacht ist. Es stellt vielmehr eine einfach zu handhabende Datenbasis für verschiedene Programmwerte dar. Wie wäre es z.B. mit einem einem einfachen Feld ?
Ausführlich :
Code:
int Feld[] = new int[60] ;
int counter = 0 ;
public final void setWert(int wert)
{
index = counter % 60 ;
counter++ ;
Feld[index] = wert ;
}
Hier läuft eine Wetterstation, die für jede Minute die aktuelle Temperatur liefert.
Mit einem Java - Programm soll ich die Minutenwerte in einer Datei speichern, und zwar so lange bis eine Stunde voll ist. Dann soll der Stundenmittelwert errechnet werden. Danach sollen alle Werte wieder aus der Datei gelöscht werden und es werden wieder neue Werte gespeichert, bis ans Ende der nächsten Stunde...
Die Methode dafür sieht bis jetzt folgendermaßen aus:
Wenn das Programm die ganze Zeit läuft brauchst du keine datei...oder?
die werte bleiben im speicher....nach einer minute errechnest du deine sachen
daraus und dann löscht du sie..und fängst wieder von vorne an.
Wenn du das errechnete ergebnis speichern musst dann musst du das natürlich in einer
datei machen. Properties sind nicht dazu gedacht.
mfg
Das Programm läuft ja nicht die ganze Zeit, sondern wird jede Minute neu compiliert, damit die neuen Daten erfaßt werden...
Deshalb muss ich die Werte, denke ich, in einer externen Datei speichern... weil ja ansonsten immer wieder der jeweilige Wert durch den nächsten überschrieben wird, bei jedem Programmstart...
Mmmhhh,
kannst Du mal bitte Deine genaue Vorgehensweise schildern ! Warum startest Du das Prog. jede Minute neu, kann das nicht auch in einer Schleife laufen oder per Zeitabfrage genau jede Minute einmal aufgeweckt werden ? Wenn das geht, ist es auf jeden Fall zu bevorzugen !!!!
Falls die Option nicht geht und Deine Datei kein bestimmtes Format hat bzw. keine Interaktionen mit anderen Programmen bestehen die auf diese Datei zugreifen, dann kannst Du ganz einfach das Serializable Interface benutzen. D.h. hiermit kann Dein gesamtes Objekt auf einmal abgespeichert werden und beim nächsten Programmstart lädst Du dieses einfach wieder. Für das Objekt macht es keinen Unterschied. Hierbei bietet sich dann das Abspeichern der Daten in einem Feld an. Zusätzlich verlierst Du auch keine anderen Informationen.
Code:
public class XYKlasse implements java.io.Serializable
{
......
}
Im Hauptprogramm (bzw. Hauptobjekt) brauchst Du diese Methoden
Code:
private final void saveIt(String FileName)
{
/* in Datei speichern */
if ((FileName == null) || (FileName.length() == 0))
FileName = "default.bak" ;
try
{
FileOutputStream o = new FileOutputStream(FileName) ;
ObjectOutputStream oo = new ObjectOutputStream(o) ;
oo.writeObject( InstaceOfXYKlasse ) ;
oo.flush() ;
oo.close() ;
}
catch (Exception e) {}
}
private final XYKlasse loadIt(String fileName)
{
XYKlasse back = null ;
try
{
FileInputStream i = new FileInputStream( fileName) ;
ObjectInputStream oi = new ObjectInputStream( i) ;
back = (XYKlasse) oi.readObject() ;
}
catch (Exception e)
{
System.out.println("\n !!! Load error !!!\n") ;
System.out.println(e.getMessage());
}
return back ;
}
Ich hoffe das haut jetzt so ungefähr hin, hab grad nichts zum testen in der Nähe....
Hmmmm...
ich glaube ich erkläre das hier viel zu kompliziert...
Aaaalso: Die Datenfiles gelangen permanent durch einen ComClient auf meinen Rechner... Dieser fragt die Daten genauer gesagt jede Minute ab.
So sieht z.B. ein File aus:
Hierbei ist T0 z.B. die Bezeichnung für den Temperatursensor, V0 für die Windgeschwindigkeit usw...
Die Werte in den jeweiligen Zeilen (z.B. bei T0) geben dann den jeweils aktuellen Wert an(= Minutenwert), sowie auch stündlich Maximal - und Minimalwerte.
Durch mein Java- Programm werden aus den Zeilen die einzelnen Werte heraus gefiltert, wenns sein muss umgerechnet... ich muss lediglich realisieren das die ankommenden Datenfiles das Java-Programm durchlaufen, bevor sie dann in der Datenbank abgelegt werden. Ich möchte in der Datenbank jeweils stündliche Durchschnitts- Maximal- und Minimalwerte ablegen. Fast jeder Sensor liefert mir diese Werte bereits, d.h. die Wetterstation ist in der Lage diese Werte selbst zu berechnen. Nur einen stündlichen Durchschnittswert für die Temperatur kriege ich eben nicht
und muss mir diesen eben erst aus den aktuellen Werten berechnen, damit ich diesen dann später in der Datenbank ablegen kann. Mein Problem ist das ich nicht weiß wie ich diesen am Einfachsten berechne...
Ja also, da würd ich das Prog nicht jedesmal selbst starten ! Bau Dir zum Bsp einen Thread und wecke diesen pro Minute einmal auf oder wenn Du die Daten bekommst. Dann kannst Du die Daten in ein Feld Schreiben :
Code:
int Feld[] = new int[60] ;
int counter = 0 ;
public final void setWert(int wert)
{
index = counter % 60 ;
counter++ ;
Feld[index] = wert ;
}
Falls der Counter einen Schwellwert überschritten hat, kannst Du dann die Mittelung anstoßen.
wenn es exakt werden soll empfiehlt es sich die zeit, die das programm braucht zu bestimmen und nur noch die übrige zeit warten lassen und dafür emüpfiehlt sich:
Code:
try {
Thread.sleep(zeit);
}
catch (InterruptedException e) { } //während des wartens können fehler auftreten die keine behandlung benötigen er muss aber das try catch teil haben um nicht abzuschmieren
Das mit dem Thread habe ich gemacht, klappt super. Das Programm wird nun jede Minute neu gestartet.
Allerdings weiß ich nicht an welcher Stelle ich nun das Feld einbauen muss...
Muss das in die Methode, in der ich die aktuellen Temperaturwerte berechne??
(d.h. in der sich die Variable, die ich brauche, befindet)
Oder wo genau muss das Feld hin???
Okay wenn ich es jetzt richtig verstehe ist calcAirTemperature(..) Deine Methode die in jeder Minute einmal aufgerufen wird. Also speicherts Du dort auch Deine aktuelle Temperatur ab. Weiterhin musst Du aber noch rausfinden, wenn eine Stunde um ist, damit der Mittelwert berechnet werden kann. Aus Deinen bisherigen Äußerungen entnehme ich, das die einzelnen gemessenen Werte später keine Rolle mehr spielen - ALSO brauchen diese auch nicht in einem Feld abgespeichert werden. Stattdessen schlage ich vor, das Du die Werte aufaddierst und nach 60 Minuten (60 Messungen) einfach dividierst.
Ich stelle mir das grob gesehen so vor :
Code:
public class TMeasure
{
private double tempMittelWert = 0.0 ;
private int tempCounter = 0 ;
private void calcAirTemperature(String inputStr)
{
// ...
// bla bla bla
// ...
tempMittelWert = tempMittelWert + t4 ; // fuer die Mittelwertbildung der Temp
tempCounter++ ;
if (tempCounter > 59) // 60 Messwerte !!!
{
// Mittelwert berechnen - Variable noch definieren !!!!!
newTempMittelWert = (tempMittelWert / tempCounter) ;
System.out.println(" stuendlicher Mittelwert: " +newTempMittelWert) ;
// reset Daten
tempMittelWert = 0.0 ;
tempCounter = 0 ;
}
}
}