Strings in Dateien schreiben


#1
Hallo zusammen,

und zwar bin ich dabei ein Programm zu schreiben, welches viele kleinere Strings in mehrere Datei schreiben soll.

Beispiel eines solchen Strings:

Contact wm1_water "Wassermelder wm1 [MAP(alert.map):%s]" {channel="test:wm:a651b2fa:wm1:water"}

Contact wm1_battery "Batteriestand von wm1 [MAP(battery.map):%s]" {channel="test:wm:a651b2fa:wm1:battery"}

Nun habe ich eine Klasse geschrieben die Folgen Attribute hat:

Code:
public class Items {

    public String itemTyp;
    public String itemName;
    public String itemName2;
    public String labelText;
    public String mapping;
    public String channel;
    public String channel2;
    public int Anzahl;
    public String dateiname; }
Die oben genannten Strings werden sozusagen in kleinere Ausdrücke aufgeteilt, damit man diese verändern kann in dem Beispiel oben wäre:

itemtyp = "Contact" ; itemName = "wm" ; itemName2 = "water" ; labeltext = "Wassermelder" ; mapping= "[MAP(alert.map):%s]" usw.

Von dieser Art Strings habe ich mehrere, die Items Klasse habe ich in Unterklassen aufgeteilt z.B. Bewegungsmelder, Wassermelder, Fensterkontakte, Steckdosen...

Wie wäre die beste Möglichkeit diese Strings in mehrere Dateien zu schreiben: meine Lösung bis jetzt:

Code:
public void functAusgabe() {

        PrintWriter pWriter = null;

        try {

            pWriter = new PrintWriter(new BufferedWriter(new FileWriter(dateiname)));

            for (int i = 1; i <= Anzahl; i++) {

                pWriter.println(itemTyp + " " + itemName + i + "_" + itemName2 + " " + "\"" + labelText + " " + itemName + i + " " + mapping + "\"" + " " + "{channel=" + "\"" + channel + ":" + itemName + i + ":" + channel2 + "\"" + "}");
             

            }

        } catch (IOException ioe) {

        } finally {
            if (pWriter != null) {
                pWriter.flush();
                pWriter.close();
            }
        }
    }
Gibt es hier eine bessere Möglichkeit ausser die Strings mit einem "+" zu verbinden?
Da ich ja mehrere Unterklassen habe, erstelle ich ja sozusagen jedesmal einen neuen Printwriter wo der Dateiname drin steht...

Des Weiteren habe ich eine Frage momentan habe ich eine Klasse erstellt wo die ganzen Definitionen, also die Strings festgelegt werden, damit man im späteren Verlauf, falls etwas geändert werden muss nur diese Datei bearbeiten muss:

Code:
public class Definitionen {

    /**
     *
     */
    public final static int choiceboxelemente = 10;

    // Bewegungsmelder
    public final static String bm_typ = "Contact";
    public final static String bm_name = "bm";
    public final static String bm_name2 = "movementdetector";
    public final static String bm_label = "Bewegungsmelder";
    public final static String bm_mapping = "[MAP(movement.map):%s]";
    public final static String bm_channel = "test:bm:a651b2fa";
    public final static String bm_channel2 = "movementDetector";
    public final static String bm_dateiname = "NW_Bewegungsmelder.items";

    // Kontakte
    public final static String fd_typ = "Contact";
    public final static String fd_name = "fd";
    public final static String fd_name2 = "windowContact";
    public final static String fd_label = "Tuer Fenster Kontakt";
    public final static String fd_mapping = "[MAP(contacts.map):%s]";
    public final static String fd_channel = "test:fd:a651b2fa";
    public final static String fd_channel2 = "windowContact";
    public final static String fd_dateiname = "NW_Kontakte.items";
    public final static String fd_battery = "battery";
    public final static String fd_bmapping = "[MAP(battery.map):%s]";
    public final static String fd_batterylabel = "Batteriestand von";

    // Steckdosen
    public final static String sd_typ = "Switch";
    public final static String sd_name = "sd";
    public final static String sd_namehome = "sdhome";
    public final static String sd_name2 = "onOff";
    public final static String sd_label = "Steckdose";
    public final static String sd_labelhome = "Steckdose Homematic";
    public final static String sd_mapping = "";
    public final static String sd_channel = "test:sd:a651b2fa";
    public final static String sd_channel2 = "onOff";
    public final static String sd_channel2home = "homematic:HM-ES-PMSw1-Pl:4c27bc95:NEQ0386523:1#STATE";
    public final static String sd_dateiname = "NW_Steckdosen.items";
Und das ist nur ein Ausschnitt, hat jemand eine Idee wie man sowas besser Lösen kann?

Danke im Voraus
 

HonniCilest

Erfahrenes Mitglied
#3
Und das ist nur ein Ausschnitt, hat jemand eine Idee wie man sowas besser Lösen kann?
Du könntest dir einen PrintWriterManager erstellen bei dem Vorgang und jedes Mal, wenn du einen neuen Dateinamen findest, fügst du diesen dem PrintWriterManager hinzu.
Die Ausgabe würde dann nicht mehr in deinen Items-Klassen, sondern von außen gesteuert werden. Etwa so (ungetestet):

Java:
/* verwaltende Klasse */
List<Items> items = new ArrayList<Items>();
// diverse Kindsklassen von Items der Liste hinzufügen


/* steuernde Klasse für die Ausgabe*/
PrintWriterManager manager = new PrintWriterManager();
for(Items item : items) {
    manager.print(item);
}
manager.closeAllConnections();


/* im Manager */
public void print(Items item) {
    String filename = item.getDateiName();
   
    PrintWriter writer = getOpenConnection(filename);
   
    if(!writer == null) {
        writer = addPrintWriter(filename); // erstellt einen neuen PrintWriter, fügt diese dem Manager hinzu und gibt diesen zurück
    }
   
    writer.println(item.getFileExpression()); // holt den zu schreibenden Text aus dem Item
}