Erstes "sinnvolles" Programm

masterjule

Mitglied
Hallo,

ist mein erster Post hier und ich beschäftige mich noch nicht so lange mit Java. Habe am Anfang nur so ein paar Übungen gemacht, Zeugs ausrechnen und so.
Habe jetzt mein erstet "sinnvolles" Programm geschrieben. Es ist für meine Mutter, die ein kleines Haushaltsbuch mit Tabellen führt. Das Programm legt eine Datei an und kopiert den Inhalt der Vorlage in diese.
Könnt es euch ja mal anschauen.
Hoffe auf Verbesserungsvorschläge, Kritik und Tipps.🙂

Java:
package haushaltsbuch;
import java.io.*;
import java.nio.channels.FileChannel;
import java.util.*;
import java.text.*;
import java.util.regex.Pattern;

/**
 *
 * @author julian
 * @version 0.1.4
 */
public class Haushaltsbuch {
    
    private static void copyFile(File in, File out) throws FileNotFoundException, IOException {
        /*
         * Kopiert den Inhalt einer Datei in eine Andere
         */
        FileChannel inChannel = new FileInputStream(in).getChannel();
        FileChannel outChannel = new FileOutputStream(out).getChannel();
        try {
            inChannel.transferTo(0, inChannel.size(), outChannel);
        } catch (IOException e) {
            throw e;
        } finally {
            if (inChannel != null)
                inChannel.close();
            if (outChannel != null)
                outChannel.close();
        }
        
    }

    private static String date(String schalter) {
        /*
         * Abfrage des aktuellen Monats und Jahres
         */
        Calendar cal = new GregorianCalendar();
        Date date = cal.getTime();
        if (schalter.equals("monat")) {
            DateFormat monat = new SimpleDateFormat("MM' - 'MMMM");
            return(monat.format(date));
        }
        else if (schalter.equals("jahr")) {
            DateFormat jahr = new SimpleDateFormat("yyyy");
            return(jahr.format(date));
        } else
            return("");
    }
    public static void main(String[] args) throws FileNotFoundException, IOException {
        String monat = date("monat");
        String jahr = date("jahr");
        String[] monatTeil = monat.split("\\s");
        
        // Eingabe
        System.out.println("\nHaushaltsbuch\n");
        String sEingabe = "";
        BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
        System.out.print("Haushaltsbuchseite für [" + jahr + "] [" + monatTeil[2] + "] anlegen? ");
        try {
            sEingabe = input.readLine();
        } catch (IOException e) { System.out.println("Eingabefehler"); }
        
        /*
         * Falls Eingabe nicht leer
         * Prüft, ob die Eingabe einen Punkt als Trenner enthält
         * Wenn ja, dann wir die Eingabe am Punkt getrennt
         * Die Monatseingabe wird ins richtige Format gebracht
         */
        if (!sEingabe.isEmpty()) {
            if (sEingabe.contains(".")) {
                String[] jahrMonat = sEingabe.split(Pattern.quote("."));
                jahr = jahrMonat[0];
                monat = jahrMonat[1];
            } else {
                monat = sEingabe;
            }
            if (monat.equals("01") || monat.equals("1") || monat.equals("Januar") || monat.equals("januar"))
                monat = "01 - Januar";
            else if (monat.equals("02") || monat.equals("2") || monat.equals("Februar") || monat.equals("februar"))
                monat = "02 - Februar";
            else if (monat.equals("03") || monat.equals("3") || monat.equals("März") || monat.equals("märz"))
                monat = "03 - März";
            else if (monat.equals("04") || monat.equals("4") || monat.equals("April") || monat.equals("april"))
                monat = "04 - April";
            else if (monat.equals("05") || monat.equals("5") || monat.equals("Mai") || monat.equals("mai"))
                monat = "05 - Mai";
            else if (monat.equals("06") || monat.equals("6") || monat.equals("Juni") || monat.equals("juni"))
                monat = "06 - Juni";
            else if (monat.equals("07") || monat.equals("7") || monat.equals("Juli") || monat.equals("juli"))
                monat = "07 - Juli";
            else if (monat.equals("08") || monat.equals("8") || monat.equals("August") || monat.equals("august"))
                monat = "08 - August";
            else if (monat.equals("09") || monat.equals("9") || monat.equals("September") || monat.equals("september"))
                monat = "09 - September";
            else if (monat.equals("10") || monat.equals("Oktober") || monat.equals("oktober"))
                monat = "10 - Oktober";
            else if (monat.equals("11") || monat.equals("November") || monat.equals("november"))
                monat = "11 - November";
            else if (monat.equals("12") || monat.equals("Dezember") || monat.equals("dezember"))
                monat = "12 - Dezember";
            else {
                System.out.println("Falsche Monatsangabe!");
                System.exit(0);
            }
        }
        
        // Prüft, ob der Ordner mit dem entsprechenden Jahr vorhanden ist und legt ihn an, falls nicht
        File ordner = new File(jahr);
        if (ordner.exists() != true) {
            ordner.mkdir();
        }
        
        /*
         * Prüft, ob die Datei mit dem entsprechenden Namen schon vorhanden ist und bricht in dem Fall das Programm ab
         * Ansonstens: Legt die Datei mit dem entsprechenden Namen an
         */
        String dateiName = jahr+"/"+monat+" "+".ods";
        File datei = new File(dateiName);
        if (datei.exists() == true) {
            System.out.println("Die Datei existiert bereits!");
            System.exit(0);
        }
        try {
            datei.createNewFile();
        } catch (IOException e) {System.out.println("Datei anlegen fehlgeschlagen"); }
        
        // Kopiert den Inhalt der Vorlage in die neue Dateo
        File inF = new File("Vorlage.ods");
        File outF = new File(dateiName);
        copyFile(inF, outF);  
        System.out.println("Datei "+ dateiName + " erfolgreich angelegt.");
    }
}

Gruß
Julian
 
Was mir aufgefallen ist, dass du einemal nach equals "august" und einmal nach equals August und so weiter überprüfst.

Das ginge einfacher mit equalsIgnoreCase("august")

Edit: ganz versteh ich sowieso nicht was dein Programm macht ich habs bei mir mal gestartet und dann wuste ich nicht was ich machen sollte. Da stand zwar schön eine Frage, aber ich hatte keine Idee was ich jetzt eingeben musste. Man sollte hier immer zusätzlich hinschreiben, was der User jetzt eingeben kann.

Weiters ist es nicht gut wenn man das Programm nicht iwie länger laufen kann. Das Programm terminiert einfach wenn man es einmal verwendet hat.
 
Zuletzt bearbeitet:
Ich habe deinen Code nur überflogen, aber du betreibst einen Riesen Aufwand, nur um Monat und Jahr einzulesen. Nimm einen einfachen Swing-Dialog, den kannst du auch von der Konsole starten:

Java:
import javax.swing.JComboBox;
import javax.swing.JPanel;

...

    public static int[] getMonthAndYear() {
        JPanel panel = new JPanel();
        JComboBox monthBox = new JComboBox( new String[]{
            "Jan","Feb","Mar","Apr","May","Jun",
            "Jul","Aug","Sep","Oct","Nov","Dec"});
        JComboBox yearBox = new JComboBox( new String[] {
            "2010","2011","2012","2013","2014","2015"
        });
        panel.add(monthBox);
        panel.add(yearBox);
        JOptionPane.showMessageDialog(null, panel);
        int[] result = new int[2];
        result[0] = monthBox.getSelectedIndex() + 1; //Jan = 1 u.s.w.
        result[1] = yearBox.getSelectedIndex() + 2010; 
        return result;    
    }


//Anwendung
int[] result = getMonthAndYear();
System.out.println(result[0]); //Monat
System.out.println(result[1]); //Jahr
 
Hallo,

habe den Code nur kurz überflogen.

Wäre doch eine Idee nach dem Erstellen der Datei dieselbige mit dem dazugehörigen Programm zu öffnen.

Schau dir hierfür mal diese Links an:
Desktop (Java Platform SE 6)
How to Integrate with the Desktop Class (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Other Swing Features)

Oder versuche das Programm mit einer GUI auszustatten. Konsolenanwendungen sind nicht jedermans Sache.

Versuche einfach das Programm immer weiter zu verbessern oder mit sinnvollen Funktionen zu ergänzen, die der Anwender braucht.

MfG
hansmueller
 
@ AmunRa: Also, man hat eine Datei Vorlage.ods, in der die Vorlage für eine Haushaltsbuchseite ist. Wenn man im Programm keine Eingabe macht, sondern nur auf Enter drückt, überprüft es, ob ein Ordner mit dem aktuellen Jahr, also 2011, schon vorhanden ist und legt diesen an, falls nicht. Als nächstes legt es in diesem Ordner eine Datei, mit dem aktuellen Monat als Name, an -> "05 - Mai.ods". Es überprüft natürlich vorher, ob die Datei schon vorhanden ist, weil dann gibts ja nichts mehr zu tun. Dann wird noch der Inhalt aus der Vorlage.ods in die neue Datei kopiert. Fertig.
Wenn man jetzt aber eine Datei für einen anderen Monat anlegen will, z.B. weil mans im Vormonat vergessen har, dann kann man bei der Eingabe den Monatsnamen oder -zahl angeben und das Programm legt die Datei entsprechend an. Wenn man noch ein anderes Jahr will, muss man bei der Eingaber die Jahreszahl,Monatsname/zahl angeben (z.B. 2010.Dezember).
Hoffe du hast es jetzt einigermaßen verstanden 🙂
Und noch danke für den Hinweis auf equalsIgnoreCase, wusste nicht, dass es das gibt. Werde das aufjedenfall ändern!

@ landei: Wollte da jetzt eigentlich ix grafisches verwenden, weils nicht wirklich nötig ist. Habe eine kleine Batch Datei erstellt, damit man das Programm unter Windows leicht starten kann.

@ hansmueller: Das wäre cool. Muss ich mir mal anschauen.

@ all: Danke für eure Antworten

Gruß
Julian
 
@ landei: Wollte da jetzt eigentlich ix grafisches verwenden, weils nicht wirklich nötig ist.
Der Aufwand ist wesentlich kleiner, die Eingabe komfortabler und falsche Eingaben unmöglich.

Habe eine kleine Batch Datei erstellt, damit man das Programm unter Windows leicht starten kann.
Wie gesagt, für diese Dialoge brauchst du kein Swing-Fenster oder so, du kannst selbige auch direkt von der Konsole aus starten. Und am Start-Vorgang deines Programmes ändert sich sowieso nichts (du kannst übrigens auch Swing-Programme ganz normal mit Batch-Dateien starten)
 
So, jetzt sieht der Code so aus. Hab das mit dem equalsIgnoreCase umgesetzt
Java:
package haushaltsbuch;
import java.io.*;
import java.nio.channels.FileChannel;
import java.util.*;
import java.text.*;
import java.util.regex.Pattern;

/**
 *
 * @author julian
 * @version 0.1.7
 */
public class Haushaltsbuch {
    
    private static void copyFile(File in, File out) throws FileNotFoundException, IOException {
        /*
         * Kopiert den Inhalt einer Datei in eine Andere
         */
        FileChannel inChannel = new FileInputStream(in).getChannel();
        FileChannel outChannel = new FileOutputStream(out).getChannel();
        try {
            inChannel.transferTo(0, inChannel.size(), outChannel);
        } catch (IOException e) {
            throw e;
        } finally {
            if (inChannel != null)
                inChannel.close();
            if (outChannel != null)
                outChannel.close();
        }
        
    }

    private static String date(String schalter) {
        /*
         * Abfrage des aktuellen Monats und Jahres
         */
        Calendar cal = new GregorianCalendar();
        Date date = cal.getTime();
        if (schalter.equals("monat")) {
            DateFormat monat = new SimpleDateFormat("MM' - 'MMMM");
            return(monat.format(date));
        }
        else if (schalter.equals("jahr")) {
            DateFormat jahr = new SimpleDateFormat("yyyy");
            return(jahr.format(date));
        } else
            return("");
    }
    public static void main(String[] args) throws FileNotFoundException, IOException {
        String monat = date("monat");
        String jahr = date("jahr");
        String[] monatTeil = monat.split("\\s");
        
        // Eingabe
        System.out.println("\nHaushaltsbuch\n");
        String sEingabe = "";
        BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
        System.out.print("Haushaltsbuchseite [" + jahr + "] [" + monatTeil[2] + "] anlegen? ");
        try {
            sEingabe = input.readLine();
        } catch (IOException e) { System.out.println("Eingabefehler"); }
        
        /*
         * Falls Eingabe nicht leer
         * Prüft, ob die Eingabe einen Punkt als Trenner enthält
         * Wenn ja, dann wir die Eingabe am Punkt getrennt
         * Die Monatseingabe wird ins richtige Format gebracht
         */
        if (!sEingabe.isEmpty()) {
            if (sEingabe.contains(".")) {
                String[] jahrMonat = sEingabe.split(Pattern.quote("."));
                jahr = jahrMonat[0];
                monat = jahrMonat[1];
            } else {
                monat = sEingabe;
            }
            if (monat.equals("1") || monat.equalsIgnoreCase("januar"))
                monat = "01 - Januar";
            else if (monat.equals("2") || monat.equalsIgnoreCase("februar"))
                monat = "02 - Februar";
            else if (monat.equals("3") || monat.equalsIgnoreCase("märz"))
                monat = "03 - März";
            else if (monat.equals("4") || monat.equalsIgnoreCase("april"))
                monat = "04 - April";
            else if (monat.equals("5") || monat.equalsIgnoreCase("mai"))
                monat = "05 - Mai";
            else if (monat.equals("6") || monat.equalsIgnoreCase("juni"))
                monat = "06 - Juni";
            else if (monat.equals("7") || monat.equalsIgnoreCase("juli"))
                monat = "07 - Juli";
            else if (monat.equals("8") || monat.equalsIgnoreCase("august"))
                monat = "08 - August";
            else if (monat.equals("9") || monat.equalsIgnoreCase("september"))
                monat = "09 - September";
            else if (monat.equals("10") || monat.equalsIgnoreCase("oktober"))
                monat = "10 - Oktober";
            else if (monat.equals("11") || monat.equalsIgnoreCase("november"))
                monat = "11 - November";
            else if (monat.equals("12") || monat.equalsIgnoreCase("dezember"))
                monat = "12 - Dezember";
            else {
                System.out.println("Falsche Monatsangabe!");
                System.exit(0);
            }
        }
        
        // Prüft, ob der Ordner mit dem entsprechenden Jahr vorhanden ist und legt ihn an, falls nicht
        File ordner = new File(jahr);
        if (ordner.exists() != true) {
            ordner.mkdir();
        }
        
        /*
         * Prüft, ob die Datei mit dem entsprechenden Namen schon vorhanden ist und bricht in dem Fall das Programm ab
         * Ansonstens: Legt die Datei mit dem entsprechenden Namen an
         */
        String dateiName = jahr+"/"+monat+" "+".ods";
        File datei = new File(dateiName);
        if (datei.exists() == true) {
            System.out.println("Die Datei existiert bereits!");
            System.exit(0);
        }
        try {
            datei.createNewFile();
        } catch (IOException e) {System.out.println("Datei anlegen fehlgeschlagen"); }
        
        // Kopiert den Inhalt der Vorlage in die neue Dateo
        File inF = new File("Vorlage.ods");
        File outF = new File(dateiName);
        copyFile(inF, outF);  
        System.out.println("Datei "+ dateiName + " erfolgreich angelegt.");
    }
}

Ok, ich werde mir das mit dem Swing-Dialog anschauen.

Hat sonst noch jemand TIpps oder Verbesserungsvorschläge?

Gruß
Julian
 
So, jetzt wird die neue Datei auch direkt geöffnet.

Java:
package haushaltsbuch;
import java.io.*;
import java.nio.channels.FileChannel;
import java.util.*;
import java.text.*;
import java.util.regex.Pattern;
import java.awt.Desktop;

/**
 *
 * @author julian
 * @version 0.3.5
 */
public class Haushaltsbuch {
    
    private static void copyFile(File in, File out) throws FileNotFoundException, IOException {
        /*
         * Kopiert den Inhalt einer Datei in eine Andere
         */
        FileChannel inChannel = new FileInputStream(in).getChannel();
        FileChannel outChannel = new FileOutputStream(out).getChannel();
        try {
            inChannel.transferTo(0, inChannel.size(), outChannel);
        } catch (IOException e) {
            throw e;
        } finally {
            if (inChannel != null)
                inChannel.close();
            if (outChannel != null)
                outChannel.close();
        }
        
    }

    private static String date(String schalter) {
        /*
         * Abfrage des aktuellen Monats und Jahres
         */
        Calendar cal = new GregorianCalendar();
        Date date = cal.getTime();
        if (schalter.equals("monat")) {
            DateFormat monat = new SimpleDateFormat("MM' - 'MMMM");
            return(monat.format(date));
        }
        else if (schalter.equals("jahr")) {
            DateFormat jahr = new SimpleDateFormat("yyyy");
            return(jahr.format(date));
        } else
            return("");
    }
    public static void main(String[] args) throws FileNotFoundException, IOException {
        String monat = date("monat");
        String jahr = date("jahr");
        String[] monatTeil = monat.split("\\s");
        int warten = 3 * 1000; // 3 Sekunden warten
        
        // Eingabe
        System.out.println("\nHaushaltsbuch\n");
        String sEingabe = "";
        BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
        System.out.print("Haushaltsbuchseite [" + jahr + "] [" + monatTeil[2] + "] anlegen? ");
        try {
            sEingabe = input.readLine();
        } catch (IOException e) { System.out.println("Eingabefehler"); }
        
        /*
         * Falls Eingabe nicht leer
         * Prüft, ob die Eingabe einen Punkt als Trenner enthält
         * Wenn ja, dann wir die Eingabe am Punkt getrennt
         * Die Monatseingabe wird ins richtige Format gebracht
         */
        if (!sEingabe.isEmpty()) {
            if (sEingabe.contains(".")) {
                String[] jahrMonat = sEingabe.split(Pattern.quote("."));
                jahr = jahrMonat[0];
                monat = jahrMonat[1];
            } else {
                monat = sEingabe;
            }
            if (monat.equals("1") || monat.equalsIgnoreCase("januar"))
                monat = "01 - Januar";
            else if (monat.equals("2") || monat.equalsIgnoreCase("februar"))
                monat = "02 - Februar";
            else if (monat.equals("3") || monat.equalsIgnoreCase("märz"))
                monat = "03 - März";
            else if (monat.equals("4") || monat.equalsIgnoreCase("april"))
                monat = "04 - April";
            else if (monat.equals("5") || monat.equalsIgnoreCase("mai"))
                monat = "05 - Mai";
            else if (monat.equals("6") || monat.equalsIgnoreCase("juni"))
                monat = "06 - Juni";
            else if (monat.equals("7") || monat.equalsIgnoreCase("juli"))
                monat = "07 - Juli";
            else if (monat.equals("8") || monat.equalsIgnoreCase("august"))
                monat = "08 - August";
            else if (monat.equals("9") || monat.equalsIgnoreCase("september"))
                monat = "09 - September";
            else if (monat.equals("10") || monat.equalsIgnoreCase("oktober"))
                monat = "10 - Oktober";
            else if (monat.equals("11") || monat.equalsIgnoreCase("november"))
                monat = "11 - November";
            else if (monat.equals("12") || monat.equalsIgnoreCase("dezember"))
                monat = "12 - Dezember";
            else {
                System.out.println("Falsche Monatsangabe!");
                // Wartet x Sekunden
                try {
                Thread.sleep(warten);
                } catch (InterruptedException e) { System.out.println("Sleep fehlgeschlagen"); }
                System.exit(0);
            }
        }
        
        // Prüft, ob der Ordner mit dem entsprechenden Jahr vorhanden ist und legt ihn an, falls nicht
        File ordner = new File(jahr);
        if (ordner.exists() != true) {
            ordner.mkdir();
        }
        
        /*
         * Prüft, ob die Datei mit dem entsprechenden Namen schon vorhanden ist und bricht in dem Fall das Programm ab
         * Ansonstens: Legt die Datei mit dem entsprechenden Namen an
         */
        String dateiName = jahr+"/"+monat+" "+".ods";
        File datei = new File(dateiName);
        if (datei.exists() == true) {
            System.out.println("Die Datei existiert bereits!");
            // Datei öffnen
            Desktop desktop = Desktop.getDesktop();
            desktop.open(datei);
            // Wartet x Sekunden
            try {
            Thread.sleep(warten);
            } catch (InterruptedException e) { System.out.println("Sleep fehlgeschlagen"); }
            System.exit(0);
        }
        try {
            datei.createNewFile();
        } catch (IOException e) {System.out.println("Datei anlegen fehlgeschlagen"); }
        
        // Kopiert den Inhalt der Vorlage in die neue Dateo
        File inF = new File("Vorlage.ods");
        File outF = datei;
        copyFile(inF, outF);  
        System.out.println("Datei "+ dateiName + " erfolgreich angelegt.");
                
        // Neu angelegte Datei öffnen
        Desktop desktop = Desktop.getDesktop();
        desktop.open(datei);
        
        // Wartet x Sekunden
        try {
            Thread.sleep(warten);
        } catch (InterruptedException e) { System.out.println("Sleep fehlgeschlagen"); }
    }
}

Gruß
Julian
 
Hallo,

es ist etwas sauberer, wenn du zuerst prüfst, ob die Klasse Desktop überhaupt unterstützt wird, bevor du damit irgendwelche Sachen machst. Diese Unterstützung muß nicht unbedingt auf allen Systemen der Fall sein.
Java:
if(Desktop.isDesktopSupported()) 
{
            Desktop desktop = Desktop.getDesktop();
            desktop.open(datei);
}
Unter Linux sind die Funktionen dieser Klasse anscheinend von ein paar Gnome-Bibliotheken abhängig.

Warum läßt du das Programm jetzt manchmal 3 Sekunden warten?

MfG
hansmueller
 
Danke, habe die Überprüfung eingebaut.
Das Programm ist für meine Mutter und Windows Vista. Es wird über eine Batchdatei gestartet und das Konsolenfenster schließt sich sofort wieder, wenn das Programm fertig ist, so kann man ja nicht lesen, ob es erfolgreich war, deshalb die 3 Sekunden warten.

Gruß
Julian
 
Hallo,

falls du deine Anwendung noch verbessern möchtest, könntest die Monatsabfragen mittels Enum vermeidlich schöner lösen.

Mit entsprechendem ENUM wäre die Abfrage über folgende Methode zu steuern

Beispiel:

Java:
public class test {

	
	public static void main(String... args){
		
		
		String[] monate = new String[]{"januar", "dezember","2"};
		
		for(String monat: monate){
			System.out.println(isMonth(monat));
		}
	}


	public static String isMonth(String value){
		String returnValue = null;
		try{
			int monthIntValue = Integer.parseInt(value);
			returnValue = MONTH.values()[monthIntValue-1].toString();
		}catch(IllegalArgumentException e){
			returnValue =MONTH.valueOf(value.toUpperCase()).toString();
		}catch (IndexOutOfBoundsException iofb){
			//ungueltige Monatsnummer
		}
		return returnValue;
	}
	
}

Ausgabe:

Java:
1	-	Januar
12	-	Dezember
2	-	Februar

Enum wäre dann wie folgt aufgebaut

Java:
public enum MONTH {
 
	JANUAR("Januar"),
	FEBRUAR("Februar"),
	MÄRZ("März"),
	APRIL("April"),
	MAI("Mai"),
	JUNI("Juni"),
	JULI("Juli"),
	AUGUST("August"),
	SEPTEMBER("September"),
	OKTOBER("Oktober"),
	NOVEMBER("November"),
	DEZEMBER("Dezember");	
	
	String printValue;
	
	MONTH(String printValue){
		this.printValue = printValue;
	}
	
	public String toString(){
		return(this.ordinal()+1)+ "\t-\t"+this.printValue;
	}
}

Obs gefällt, ist wohl Geschmacksache. Ich persönlich steh auf Enums.
 
Zuletzt bearbeitet:
Danke, habe die Überprüfung eingebaut.
Das Programm ist für meine Mutter und Windows Vista. Es wird über eine Batchdatei gestartet und das Konsolenfenster schließt sich sofort wieder, wenn das Programm fertig ist, so kann man ja nicht lesen, ob es erfolgreich war, deshalb die 3 Sekunden warten.

Gruß
Julian

Du kannst auch in die Batch-Datei eine weitere Zeile "pause" einfügen. Das Fenster terminiert dann erst nach einem weiteren Tastendruck 😉
 

Neue Themen


Zurück
Oben