Zum Inhalt springen

PerdianMG

Mitglieder
  • Gesamte Inhalte

    103
  • Benutzer seit

  • Letzter Besuch

Beiträge von PerdianMG

  1. in meinem Programm ist es bisher so geregelt, dass erst eine Datei komplett in ein byte-array gelesen wird und danach wird dieses byte-array auf einen GZIPOutputStream geschickt.

    Jetzt möchte ich das so machen, dass gleich beim Lesen auch schon gleich geschrieben wird, um die Performance zu verbessern.

    Hat da jemand einen Ansatz für mich?

    Naja eigentlich ganz einfach - du brauchst halt eine Quelle, wo deine Daten herkommen (einen InputStream) und ein Ziel, wo die Daten hingeschrieben werde (einen OutputStream). Als Beispiel mal der einfache Weg, eine Datei direkt zu kopieren:

    
    public void copyFile(File source, File destination) throws IOException {
    
      InputStream in = new BufferedInputStream(FileInputStream(source));
    
      OutputStream out = new BufferedOutputStream(new FileOutputStream(destination));
    
      for(int data = in.read(); data > -1; data = in.read()) {
    
        out.write(data);
    
      }
    
      out.flush();
    
      out.close();
    
      in.close();
    
    }
    
    

    Ciao

    Christian

  2. ich habe ein GUI für eine Konsolenanwendung geschrieben (W2K). Ich habe allerdings das Problem, dass die GUI zur Ausführungszeit ca. 15 MB Arbeitsspeicher nutzt (das schafft bei mir sonst kaum eine andere Anwendung!).

    Ich würde das nicht als Speicherfresser bezeichnen, sondern als normales Java-Programm. Da kannst du machen was du willst aber sobald die VM erstmal oben ist und du ein paar graphische Elemente erstellt hast wirst du immer schon bei über 10 MB liegen.

    Aber ich würde mir da auch keinen soooo großen Kopf drum machen. Hab gerade mal bei mir in die Prozesstabelle gesehen und zwei IE Instanzen liegen auch bei 12 und 14 MB - das liegt also auf dergleichen Stufe.

    Eclispse benötigt bei mir auch schonmal 50 MB und mehr. Aber wir haben ja auch keinen Wettbewerb "Wer benötigt am wenigsten Speicher". Gedanken würde ich mir erst machen, wenn dein Programm merklich langsamer wird und das ganze System mit nach unten zieht.

    Ciao

    Christian

  3. Darf man das frei verfügbare JDK von SUN auch für kommerzielle Zwecke

    nutzen, oder muss man dazu eine spezielle Lizenz beantragen?!

    Das kommt darauf an, was du genau meinst. Zum Entwickeln darfst du das JDK, JSDK, oder wie es auch gerade heisst, verwenden ohne irgendetwas zu beachten. Wenn du deine Programme weitergibst, dann darfst du jedoch nur das JRE mit verteilen.

    Ciao

    Christian

  4. Und deshalb gehe ich immer davon aus, dass Objekte keinen Destruktor haben. Habe ich bis jetzt auch nicht gebraucht (und fand ich bei C++ ziemlich nervig)
    Wie man es auch immer drehen will: es gibt in Java keinen Destruktor. Wie auch? Wie willst du ihn aufrufen? Sowas wie .free() gibt's nicht und .finalize() ist protected also kann man das auch nicht als quasi Destruktor sehen.

    Ciao

    Christian

  5. Allerdings wird bei jedem Object das im GC landet die finalize Methode aufgerufen. Also eine Art Ersatz-Destruktor.

    Nein auch keine Art Ersatz-Destruktur. Bei einem Destruktor bist du sicher, dass er aufgerufen wird, wenn dein Object zerstört wird (sonst würde ihn ja niemand aufrufen *g* aber okay), bei finalize() kannst du nie wirklich wissen, ob sie auch wirklich aufgerufen wird, denn wie in der Doku steht es _sollte_ zwar von der VM immer getan werden, aber wirklich sicher sein kannst du nicht.

    Ciao

    Christian

  6. Hi,

    Ich habe einen String (genauer eine byte-Array) mit Zeichen, die nach CP850 (DOS-Zeichensatz) kodiert sind.

    Ich muß diese in Unicode umwandelen. Wie kann ich dies machen?

    Das ist mal einer der wenigen Fälle, wo man einen String-Constructor sinnvoll verwenden kann *g*

    byte[] byteArray = irgendwoher();

    String unicode = new String(byteArray, "CP850");

    Sollte eigentlich funktionieren, bei mir klappt das zumindestens immer wenn ich von UTF-8 nach ISO-8859-1 konvertieren muss.

    Ciao

    Christian

  7. wie wende ich das GridLayout an?

    wie kann ich die anzahl der felder in x und y richtung definieren?

    und wie füge ich in die einzelnen felder objekte (textfelder) ein?

    Sieh dir mal das JavaDoc zum GridLayout an, da steht genau drin beschrieben (mit Beispiel), wie du eine NxM breite Matrix definieren kannst.

    Die einzelnen Objekte fügst du dann dem Container hinzu, auf den du das Layout angewendet hast.

    Also z.B.

    
    
    JPanel foo = new JPanel(new GridLayout(3,3));
    
    foo.add(new JButton("Bar"));
    
    
    

    Ciao

    Christian

  8. Wenn du z.B.

    if ( string.length() != 0 )
    statt
    if ( string != "" )
    benutzt hast du schon wieder ziemlich an laufzeit gesparrt.
    Meinst du wirklich? Im zweiten Falle vergleichst du ja nur zwei Referenzen miteinander, wogegen du im ersten Falle einen Methodenaufruf plus einen Vergleich hast. Ich hab's auch gerade mal durchgetestet mit
    
      String test = "eee";
    
      for(int j=0; j < 10; j++) {
    
      long start = System.currentTimeMillis();
    
      for(int i=0; i < 200000000; i++) {
    
    //    boolean erg = (test == "");
    
        boolean erg = (test.length() == 0);
    
      }
    
      long end = System.currentTimeMillis();
    
      System.err.println("x: " + (end - start));
    
    }
    
    

    Die test == "" dauert pro Durchlauf ca. 800 ms, die test.length() == 0 dauert ca. 1200 ms.

    Mal ganz nebenbei: Strings mit == zu vergleichen ist ohnehin nicht der Hit :-)

    Ciao

    Christian

  9. Ich hab mich schon mit einigen Leuten übers Programmieren unterhalten und jeder meinte irgendwie "bevor du weiter codest leg dir erst mal ein anständigen Programmierstil zu, so sieht das doch nach nichts aus".

    Aber irgendwie konnte oder wollte mir keiner sagen wie "guter Code" aussehen soll.

    Das ist wohl auch so eine Sache, die jeder anders sieht - "guter Code" ist ja ziemlich subjektiv. Nimm alleine mal diese Beiden Variationen:

    
    public static void main(String[] args) 
    
    {
    
      for(int i=0; i < args; i++)
    
      {
    
        foo(args[i]);
    
      }
    
    }
    
    
    und
    
    public static void main(String[] args)  {
    
      for(int i=0; i < args; i++) {
    
        foo(args[i]);
    
      }
    
    }
    
    
    Beide machen _exakt_ dasgleiche aber sehen doch von der Formatierung her anders aus. Ich fand mal das erste supertoll und das zweite grottenschlecht. Inzwischen hat sich das Blatt gewendet und Nr. 1 kann ich nicht mehr sehen *g* Gibt auch sowas hier (wird glaube ich bei GNU gerne so gesehen)
    
    public static void main(String[] args)  
    
      {
    
      for(int i=0; i < args; i++) 
    
        {
    
        foo(args[i]);
    
        }
    
      }
    
    

    Du siehst - alleine bei eigentlich simplen Sachen wie Einrückung prallen schon Welten aufeinander - und wir haben noch nicht einmal von Einzug geredet (wieviele Zeichen, Tabs oder keine Tabs etc.)

    Es isit also (finde ich) gar nicht mal so wichtig _wie_genau_ dein Stil aussieht - Hauptsache ist, dass es einen Stil gibt, den man wiedererkennen kann und der es einem ermöglicht das Problem relativ schnell und einfach zu verstehen.

    Ciao

    Christian

  10. Ich habs jetzt im Opera mal Probiert, da kam die Fehlermeldung Ungültiger Bytcode nachdem ich es manuell nochmal compiliert hab , läufts jetzt bedingt im Opera (Man kann nichts in JTextFileds eingeben, JButtons, JChebox, ... funktionieren).

    Der Ie meint aber immernoch Class nor found...

    Unter welche VM lässt du das Applet dennim IE laufen? Wenn es die Original Uralt-Version von Microsoft ist, dann wirst du unter Verwendung von JButton, Jxxx nicht weit kommen, da die unter 1.1 noch nicht verfügbar waren. Da wirst du dann entweder ein aktuelles JRE installieren müssen, oder dich auf die java.awt.* Klassen beschränken.

    Ciao

    Christian

  11. kann mir einer sagen ab wann man den 9er bei borland runterladen kann? den key gibts schon, aber die anwendung noch nit
    Wieso probierst du nicht einfach mal den naheliegensten Weg aus, nämlich bei Borland selber nachzusehen?

    http://www.borland.com/jbuilder/

    Dann auf Personal --> und schon steht ziemlich weit unten

    "Download JBuilder Personal - FREE!"

    So einfach ist das

    Christian

  12. Am sinnvollsten pack ich doch die Statements dann mit StringBuffer.append() zu einem StringBuffer hinzu, weise diesen einem PreparedStatement zu und führe dieses anschließende mit executeQuery() aus, oder geht das noch performanter?
    Also ein PreparedStatement brauchst du ja eigentlich nur dann, wenn du Objekte, oder andere Werte hast, die du je nach genauer Query einsetzen willst. Wenn dein SQL String wirklich von Anfang an _komplett_ feststeht, dann würde ich immer ein "normales" Statement nehmen und den Code fest reinhacken. Wenn du doch irgendwann merkst, dass du doch das ein oder andere Mal eine andere Version nehmen musst dann kann man immer noch auf Properties umsteigen.

    Ciao

    Christian

  13. Rekursiv ist es ja klar und liegt bei Bäumen sowieso auf der Hand. Iterativ würde es so oder so niemand machen, aber es ist nun mal eine Übungsaufgabe.
    Also ich habe bisher noch nie einen Baum selber komplett implementiert aber so abwegig ist mir der rekursive Ansatz gar nicht - ich würde es aus Performance-Sicht aber _immer_ iterativ machen wenn es denn möglich ist.

    Aber ich hab gesehen wo der Fehler steckt - sind zwei ziemlich einfache Dinge:

    
    01  private Node getNodeIt(Comparable key, Node tree) {
    
    02
    
    03    Node currentNode = tree;
    
    04    while(currentNode != null) {
    
    05      int currentResult = key.compareTo(currentNode.key);
    
    06      if(currentResult == 0) {
    
    07        // Gefunden!
    
    09        return currentNode;
    
    10      } else if(currentResult < 0) {
    
    11        currentNode = currentNode.left;
    
    12      } else {
    
    13        currentNode = currentNode.right;
    
    14      }
    
    15    }
    
    16
    
    17    return null;
    
    18
    
    19  }
    
    
    Die zwei Fehler steckten einmal in Zeile 10 (hier muss natürlich auf 0 und nicht auf 1 verglichen werden) und in den Zeilen 11 und 13, da muss ja von der aktuellen Node ausgegangen werden und nicht vom Ursprungsbaum. Ciao Christian P.S. Lass man folgenden Code laufen und dann sag mir nochmal ob du lieber die iterative oder recursive Variante nehmen würdest :-)
    
      public static void main(String[] args) {
    
    
        MyTreeMap treeMap   = new MyTreeMap();
    
        treeMap.put("5", "5");
    
        treeMap.put("4", "4");
    
        treeMap.put("3", "3");
    
        treeMap.put("2", "2");
    
        treeMap.put("6", "6");
    
        treeMap.put("7", "7");
    
        treeMap.put("8", "8");
    
    
        long start  = System.currentTimeMillis();
    
        for(int i=0; i < 10000000; i++) {
    
          treeMap.getNodeRec("2", treeMap.root);
    
        }
    
        long end    = System.currentTimeMillis();
    
        System.err.println("Milliseconds for recursive run: " + (end - start));
    
    
    
        start       = System.currentTimeMillis();
    
        for(int i=0; i < 10000000; i++) {
    
          treeMap.getNodeIt("2", treeMap.root);
    
        }
    
        end         = System.currentTimeMillis();
    
        System.err.println("Milliseconds for iterative run: " + (end - start));
    
    
      }
    
    

  14. Ähm, der Baum ist vom Prof vorgegeben. Wir sollten das Programm lediglich ergänzen.

    Naja dann weiss ich nicht wie's laufen soll... Struktur für's rekursive ist doch die: Du schnappst die die Wurzel und hangelst dich dann die Blätter entlang, solange bist du das Blatt gefunden hast, das für dein gesuchtes Objekt stimmt.

    Ciao

    Christian

  15. Also ich würde das ganze so probieren (ungetestet):

    
    private Node getNodeIt(Comparable key, Node tree) {
    
    
      Node currentNode = tree;
    
      while(currentNode != null) {
    
        int currentResult = key.compareTo(currentNode.key);
    
        if(currentResult == 0) {
    
          // Gefunden!
    
          return currentNode;
    
        } else if(currentResult < 1) {
    
          currentNode = tree.left;
    
        } else {
    
          currentNode = tree.right;
    
        }
    
      }
    
    
      // Kein Key hat gepasst, oder Tree war direkt am Anfang null also null zurückliefern
    
      return null;
    
    
    }
    
    

  16. Von den Grundlagen sind sich beide Sprachen, meiner Meinung nach, sehr

    Ähnlich. Nur bei C gefällt mir die Syntax besser, aber das ist ja Geschmackssache;)

    Von der Syntax her bin ich auch eher der C-Fan, schön kompakt und klar. Aber genau das kann vielleicht für den ein oder anderen Anfänger auch störend und nicht so übersichtlich wirken. Wenn ich ein BEGIN und END da stehen habe, dann sehe ich auch direkt wo's losgeht und aufhört - von der Übersichtkeit wäre da vielleicht sogar noch ADA ganz interessant, aber wir wollen mal nicht übertreiben.

    Was gerade auch für Pascal am Anfang spricht ist das - im Vergleich zu C - geradezu kinderleiche String-Handling, denn einen Anfänger auf einen char* loszulassen und dann auch noch zu verlangen, dass er das ganze versteht.

    Außerdem würde ich schon empfehlen vor C++, C zu lernen, da man so

    schon einen Einblick in verschiedene Bereiche bekommt, die man bei

    C++ durch Klassen nicht zu Gesicht bekommt.

    Sehe ich auch so. Das prozedurale Denken ist - auch wenn es manch anderer sehen möchte - auch für objektorientiertes Denken dann auch in einer Methode musst du ja letzten Endes irgendwann auch mal wirklich etwas implementieren und das geht ja sei es bei C++, Java oder Delphi eben auch nur prozedural.

    Ciao

    Christian

  17. Was würdet ihr einem Anfänger empfehlen, mit welcher Programmiersprache sollte er am besten anfangen? Vorausgesetzt er hat überhaupt keine Kenntnisse.

    Also mit VisualBasic würde ich nicht anfangen - ganz einfach deshalb, weil du dort viele Dinge machen kannst, die bei anderen Sprachen (aus guten Gründen) nicht funktionieren. Auch wenn es sich "Visual" schimpft ist halt immer noch viel von guten alten BASIC mit drin und diese Sprache ist nunmal einfach prädestiniert dafür unüberischtliche und sehr schlecht verständliche Programme zu schreiben.

    Wenn es nur um die Prinizpien der Programmierung im Allgemeinen geht würde ich mit einer übersichtlichen Sprache wie beispielsweise Pascal oder Modula anfangen. Die werden zwar in dieser Art und Weise in der Arbeitswelt nicht wirklich eingesetzt (Okay, Pascal bei Delphi aber das geht auch oft zu sehr Richtung Visual und man lernt dadurch am Anfang wenig). Wenn man damit einmal die Konzepte begriffen hat dann fällt der umstieg auf eine andere Sprache ungeheuer einfach.

    Wenn du diese Zeit nicht hast sondern direkt produktiv anfangen willst dann würde ich aber auch von C oder C++ abraten - ganz einfach deshalb weil der Super-Assembler einfach für den Anfang zu abgehoben und zu kompliziert ist (meine Meinung, aber immer auch Einstellungssache).

    Mein Fazit: Pascal und Modula bieten (auch wenn oft als Kindersprachen abgestempelt) immer noch den besten Einstieg um Grundlegende Konzepte zu lernen - und dann kann man zu "richtigen" Sprachen wie C oder Java wechseln.

    Ciao

    Christian

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...