Ergebnis 1 bis 20 von 385

Thema: IM IN YR LOOP\n VISIBLE FOO\n IM OUTTA YR LOOP - Der Programmierer-Spamthread #2

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Hi, beim letzten Java Update auf 7 Update 21 gab es eine Änderung an der Klasse java.lang.Runtime, Methode exec(), siehe http://www.oracle.com/technetwork/ja....html#jruntime .

    Mein bisheriger Aufruf war:
    Code:
    Runtime runtime = Runtime.getRuntime();
    try{
    	runtime.exec("\"D:\\irgend ein Ordner\\irgendein Programm.exe\" /argument1 bla /argument2");
    } catch(IOException e){
    	e.printStackTrace();
    }
    Allerdings wirft dieser Code mit der Version 7 Update 21 folgende Exception:
    Code:
    Exception in thread "main" java.lang.IllegalArgumentException: Executable name has embedded quote, split the argument
    Ohne die Anführungszeichen funktioniert das nicht, denn da wird der Pfad nicht gefunden, weil er dann
    Code:
    D:\\irgend
    und den Rest als Argumente aufrufen will. Die Leerzeichen einfach zu escapen geht auch nicht.

    Laut dem Changelog soll man über Runtime.exec sein Programmname und Argumente über ein Array übergeben.
    Folglich kann ich über
    Code:
    runtime.exec(new String[]{"D:\\irgend ein Ordner\\irgendein Programm.exe", "/argument1", "bla", "/argument2"});
    das Programm mit den Argumenten aufrufen. Allerdings muss wirklich jedes Argument in ein neues Element des Arrays, denn alle Argumente in ein Element zu packen funktioniert nicht.

    Der nun elegantere Weg ist es den ProcessBuilder zu nutzen, da man den Konstruktor sein Programmname und Argumente als "String..."-VarArgs übergeben kann.
    Code:
    ProcessBuilder pb = new ProcessBuilder("D:\\irgend ein Ordner\\irgendein Programm.exe", "/argument1", "bla", "/argument2");
    try{
    	pb.start();
    } catch(IOException e){
    	e.printStackTrace();
    }
    Ich frag mich was für DAUs die Entwickler von Java sind, dass sie solch eine Änderung in eine Sicherheits-Update rein machen, statt wie zu erwarten das erst mit dem Release von Java 8.

    PS: Funktionen mit VarArgs eines Typs kann man auch ein Array des gleichen Typs übergeben.

    PPS: Wenn's nicht in den Thread passt, dann bitte ein eigenen Thread daraus machen.

  2. #2
    Zitat Zitat von niR-kun Beitrag anzeigen
    Ich frag mich was für DAUs die Entwickler von Java sind, dass sie solch eine Änderung in eine Sicherheits-Update rein machen, statt wie zu erwarten das erst mit dem Release von Java 8.
    Da Java 8 nicht vor 2014 zu erwarten ist (Verschiebungen haben bei Java Tradition), wäre dies ein richtiger Schritt.
    exec(String command) empfinde ich als Krücke, da man hier wirklich mit dem Escapen aufpassen muss.

    Code:
    exec("C:\\toller ordner\\main.java");
    startet ja nicht die "main.java", sondern "toller". Das kann man durchaus als Sicherheitslücke betrachten. Da ist eine String-Array Variante deutlich besser, und wenn mich nicht alles täuscht, gabs die vorher ja auch schon.

    Geändert von Whiz-zarD (20.04.2013 um 15:29 Uhr)

  3. #3
    Path-finding in CrossCode:


  4. #4

  5. #5

    Users Awaiting Email Confirmation

    Heyjo, ich hoffe ihr könnt mir helfen :>

    Also ich möchte, dass man einen String[][] in Java auf der Festplatte speichern und wieder lesen kann.
    Ich habe für das Speichern also folgendes:
    Code:
          FileOutputStream fos = new FileOutputStream(contactFile);
          ObjectOutputStream oos = new ObjectOutputStream(fos);
          oos.writeObject(contactList);
    die Variable contactList ist ein String[][].
    Wie kann ich diese nun wieder in das Programm einlesen?
    Ich finde irgendwie keine geeignete Methode dafür. In der Schule hatten wir bisher nur das Laden/Speichern von einfachen Objekten.

  6. #6
    @Engel der Furcht: Analog zum ObjectOutputStream gibt es auch einen ObjectInputStream.

  7. #7
    Ich frage mich immer wieder, was du mit den Arrays hast.
    Da der Name contactList schon verrät, dass es eine dynamisch wachsende Liste ist, wäre es auch angebracht die Liste auch als Liste zu behandeln und die Daten stattdessen in eine ArrayList zu packen

  8. #8
    Zitat Zitat von Whiz-zarD Beitrag anzeigen
    Ich frage mich immer wieder, was du mit den Arrays hast.
    Vielleicht wurden Listen noch gar nicht im Unterricht durchgenommen?

    @ Engel der Furcht:
    Ich würde dir auch wie Whiz-zarD empfehlen auf eine ArrayList umzusteigen, dann musst du dir keine Sorge wegen Größe, etc. machen. Außerdem stehen dir auch zusätzlich nützliche Methoden bereit, die die "Verwaltung" der Liste leichter machen. Falls du aber häufig Einfüge- oder Löschoperationen durchführst, würde ich zu einer LinkedList zurückgreifen, die sind nämlich performanter als ArrayLists.

  9. #9
    Zitat Zitat von Deamonic Beitrag anzeigen
    Vielleicht wurden Listen noch gar nicht im Unterricht durchgenommen?
    Und genau das hasse ich am Informatikunterricht an Schulen, wenn die Lehrer keine Kompetenz aufweisen, dann sollen sie es gleich lassen. Den Schülern das Programmieren falsch beibringen kann nicht das Ziel der Übung sein.
    Arrays verwendet man nur, wenn man zur Laufzeit exakt die Anzahl der Elemente kennt, und die Anzahl sich auch nicht mehr ändert. Eine Veränderung der Arraygröße ist immer sehr problematisch, da ein Array als ganzer Block im Speicher liegt. Bei einer Vergrößerung muss ein neues Array erzeugt, und das alte in das neue kopiert werden, was bei vielen Änderungen sehr inperformant wird. Es macht also kein Sinn, eine Adressverwaltung mittels eines Array zu implementieren, da man eben die Anzahl der Adressen nicht kennt, die gespeichert werden sollen. Nutzer A hat vielleicht nur 3 Adressen, aber Nutzer B möchte 30.000 Adressen speichern.

    Ich schätze auch mal, dass die zweite Dimension des 2D-Arrays wohl die Daten des Kontaktes bereithält. Schon in den Anfängen der Informatik hat man erkannt, dass dies sehr bescheiden ist, und hat dafür ein Record/eine Struktur entwickelt, die die Daten ansprechender machen. In der objektorientierten Welt wäre dies einfach nur eine Klasse, die lediglich nur Getter- und Setter-Methoden für die Klassenvariablen bereitstellen. In der objektorientierten Welt nennt man sowas auch Geschäftsobjekt.

    Code:
    public class Contact
    {
        private String firstname;
        private String lastname;
        ...
    
        public getFirstname()
        {
            return this.firstname;
        }
        
        public setFirstname(String firstname)
        {
            this.firstname = firstname;
        }
    
        ...
    }
    Dann hätte man anstatt String[][] ein LinkedList<Contact>. Und wer ganz schlau ist, kapselt LinkedList<Contact> in eine Klasse:

    Code:
    public class ContactList extends LinkedList<Contact>
    {
        ...
    }
    Dies wäre dann eine Liste von Geschäftsobjekten. Der Vorteil bei diesen Objekten ist nun, dass ich jeweils für die Kontakte, als auch für die Kontaktliste eigene Logik-Methoden implementieren kann, wie z.B. das Laden oder Speichern, und ContactList ist ansprechender als LinkedList<Contact>, weil es mich nun nicht mehr interessiert, wie die Kontaktliste implementiert ist. Sie ist einfach da und ich benutze sie.


    Zitat Zitat von Engel der Furcht Beitrag anzeigen
    Ich hab einfach keine Ahnung von diesen ArrayLists.
    Der Name klingt als würden die nur eindimensional und nicht mehrdimensional sein :<
    ArrayList<ArrayList<ArrayList<String>>>

    Eine Drei-Dimensionale Liste mit Strings
    Du kannst es auch beliebig weiterführen. hab doch keine Angst, damit zu experimentieren. Es gibt doch im Internet genug Tutorials, die Listen erklären.

    Geändert von Whiz-zarD (03.05.2013 um 23:22 Uhr)

  10. #10
    Zitat Zitat von Whiz-zarD Beitrag anzeigen
    Eine Veränderung der Arraygröße ist immer sehr problematisch, da ein Array als ganzer Block im Speicher liegt. Bei einer Vergrößerung muss ein neues Array erzeugt, und das alte in das neue kopiert werden, was bei vielen Änderungen sehr inperformant wird. Es macht also kein Sinn, eine Adressverwaltung mittels eines Array zu implementieren, da man eben die Anzahl der Adressen nicht kennt, die gespeichert werden sollen. Nutzer A hat vielleicht nur 3 Adressen, aber Nutzer B möchte 30.000 Adressen speichern.
    In diesem Fall würde ich gleich anstatt der ArrayList zu einer LinkedList greifen, da bei einer Löschung eines Elements in einer ArrayList die ganze hintere Liste um eine Position nach vorne gerückt werden muss. Und in deinem Fall mit den 30.000 Adressen ist das sicher nicht zu vernachlässigen.

    EDIT: Oh, hab gerade gesehen, dass du eh eine LinkedList verwendest. ^^

    Geändert von Rusk (03.05.2013 um 23:45 Uhr)

  11. #11
    Zitat Zitat von Deamonic Beitrag anzeigen
    EDIT: Oh, hab gerade gesehen, dass du eh eine LinkedList verwendest. ^^
    Ja, da du schon recht hast, dass eine LinkedList besser wäre ^^

  12. #12

    Users Awaiting Email Confirmation

    Vielen Dank für eure Hilfe :>

    Hab da noch ne Frage (ich fühl mich so n00by hier )

    Ich hab eine Klasse. In dieser Klasse wird ein Objekt einer anderen Klasse erzeugt.
    Jetzt wird in diesem Objekt eine Methode aufgerufen und diese Methode soll aber in eine TextArea aus der ersten Klasse (also der Objekt-Erzeuger-Klasse) schreiben.
    Geht das irgendwie? :>

  13. #13

    Users Awaiting Email Confirmation

    Zitat Zitat von Whiz-zarD Beitrag anzeigen
    Ich frage mich immer wieder, was du mit den Arrays hast.
    Da der Name contactList schon verrät, dass es eine dynamisch wachsende Liste ist, wäre es auch angebracht die Liste auch als Liste zu behandeln und die Daten stattdessen in eine ArrayList zu packen
    Ich hab einfach keine Ahnung von diesen ArrayLists.
    Der Name klingt als würden die nur eindimensional und nicht mehrdimensional sein :<


    Hab das Ding jetz mit einem cast gelöst.
    Code:
    FileInputStream fis = new FileInputStream(contactFile);
          ObjectInputStream ois = new ObjectInputStream(fis);
          contactList =(String[][]) ois.readObject();
    Ich werd mir das mal mit den ArrayLists mal durchlesen...

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •