Ergebnisse als .txt Speichern.wichtig.

  • Themenstarter Themenstarter Destiny1985
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
D

Destiny1985

Gast
Hi, soll dringend was für meinen Chef machen...er will das ich Prog mache wo man von x - bis y zahlen die pruefziffer errechnet...ok soweit kein problem...doch wie mache ich es, das er die ergebnisse als .txt-datei auf dem desktop oder direkt auf c oder so ablegt ?

Eine ausführliche erklärung würde mich sehr freuen !

mfg
 
Soll dieses Programm ein GUI haben oder nur auf der Konsole ausführbar sein?

Als erstes musst du einen FileOutputStream öffnen, den du dann meinetwegen noch mit Filtern überlagerst und dann brauchst du eigentlich nur noch den Dateinamen inkl. Pfad.

Bei Java ist auch eine Insel findest du gute Erklärungen, wie auch zu vielen anderen Themen.
 
das wird nur per konsole ausgeführt...hab von ausgaben in eine txt keine ahnung...will aber gern meinen chef beeindrucken *g* wäre nett wenn ihr mir das kurz hier schreibt als beispielcode, wie ich das lösen kann...ich code solange den eigentlichen programm-code...

mfg
 
Hier einfach nur kopiert von Java ist auch eine Insel:
Code:
String s = "beliebiger Text";
FileOutputStream fos = new FileOutputStream( "c:/line.txt" );
fos.write( s.getBytes() );
fos.close;
Erzeugt ein neues Objekt von FilOutputStream. Dieses Objekt kennt die Methode write(byte[]). String's sind auch nur Objekte und die kennen die Methode getBytes(). Wo jedes einzelne Zeichen in ein Byte umgewandelt wird und in einem byte[]-Array gespeichert wird. Danach musst du den Strom noch scließen mit close().
 
Effektiver und wiederverwertbarer währe eine Methode zu schreiben die das Datei-schreiben übernimmt:

Code:
public static boolean writeFile (String text, String filename, boolean append) {

          try {
               PrintStream openFile = new PrintStream( new FileOutputStream(filename, append));
               openFile.print(text);
               openFile.flush();
               openFile.close();
               return true;
          }
          catch(IOException ioe) {
               ioe.printStackTrace();
               return false;
          }
          catch(IndexOutOfBoundsException ibe) {
               ibe.printStackTrace();
               return false;
          }
     }

Du musst beim implementieren das Packgage 'java.io.*' importieren.
Du übergibst 3 Argumente: Das erste ist der Text, der zu schreiben ist , das Zweite ist der name des Files und das dritte gibt an, ob der Text an die Datei drangehängt werden soll (true) oder nicht (false). Die Methode gibt einen boolischen Wert zurück, ob das schreiben erfolgreich war. Aufruf erfolgt also so:

Code:
...
String testText = "Dieser Text\nkommt in die Datei\n";
boolean wasWritingSuccessfull = writeFile(testText, "Testdatei.txt", false);
if(!wasWritingSuccessfull)
     System.out.println("fehler beim schreiben");

testText = "und das wird drangehängt";
wasWritingSuccessfull = writeFile(testText, "Testdatei.txt", true);
if(!wasWritingSuccessfull)
     System.out.println("fehler beim schreiben");
...
 
hm ok...ich muss sagen das was ich da lese sieht mir ganz logisch und verständlich aus, trotzdem habe ich probleme das hier geschriebene in verbindung mit meinem code zu bringen. ich habe jetzt die methode mehrfachBerechnung, die Prüfziffern aus einem zahlenraum (meinetwegen 1000580 - 1000585) ausgibt...momentan halt nur auf der konsole, das sieht dann so aus:

Code:
Die Pruefziffer der Zahl 1000580 ist 4
Die Pruefziffer der Zahl 1000581 ist 1
Die Pruefziffer der Zahl 1000582 ist 8
Die Pruefziffer der Zahl 1000583 ist 5
Die Pruefziffer der Zahl 1000584 ist 2
Die Pruefziffer der Zahl 1000585 ist 9

soweit, sogut...nun will ich wie gesagt dieses nicht auf konsole ausgeben, sondern in einer Text-Datei speichern...wie funktioniert das ? Wäre nett wenn mir das einfach mal wer in die Methode reincodet, damit ich mal sehe wie man sowas implementiert...hier die entsprechende Methode

Code:
public static void MehrfachBerechnung(long startZahl, long endZahl)
  {
    int zaehler = (int)(endZahl - startZahl)+1;
    long zahl = startZahl;

    while ( zaehler != 0 )
    {
      long cur = 0,sum = 0,var = 3,original = zahl;
      long laenge = String.valueOf(zahl).length();


      while(laenge-- > 0)
      {

        cur = zahl % 10;
        zahl /= 10;
        sum += cur * var;
        var = var == 3 ? 1 : 3;
      }

      if(sum % 10 == 0)
        System.out.println("\nDie Pruefziffer der Zahl " + original + " ist 0");
      else
        System.out.println("\nDie Pruefziffer der Zahl " + original + " ist " + (10 - (sum % 10)));

      zaehler = zaehler - 1;
      zahl = ++startZahl;
    }
  }

ich weiss, das mit dem zaehler ist wohl etwas gewurschtelt, habe es aber so ganz gut hinbekommen, und es läuft ja auch ^^

mfg
 
wir sind sehr gg "reincoden"....

schau dir in der Insel oder im JavaBuch mal die entsprechenden Kapitel an.

Mein Tipp: Schau dir die Klasse PrintWriter an.
 
ich weiss das ihr gegen reincoden seid, aber ich muss doch erstmal sowas sehen um es auch zu verstehen...das hat bei mir bisher immer gut geklappt! Und wenn ich es einmal sehen werd ich es sicher auch schnell begreifen und selber anwenden können...und das ich nicht hier bin, um HA gemacht zu bekommen oder so dürfte mittlerweile allen klar sein 😉

wäre also nett wenn sich mal jemand "opfert" und mir das zeigt...

mfg
 
Aus
Code:
      if(sum % 10 == 0)
        System.out.println("\nDie Pruefziffer der Zahl " + original + " ist 0");
      else
        System.out.println("\nDie Pruefziffer der Zahl " + original + " ist " + (10 - (sum % 10)));
machst du
Code:
      String meinString = "";
      if(sum % 10 == 0)
        meinString += "\nDie Pruefziffer der Zahl " + original + " ist 0\n";
      else
        meinString += "\nDie Pruefziffer der Zahl " + original + " ist " + (10 - (sum % 10)) + "\n";

und übergibst diesen String zum Schluss der Methode von Dreezard:
Code:
writeFile (meinString, "dateiname.txt", false);
 
Oder du machst am Anfang der Methode
Code:
BufferedWriter bw = new BufferedWriter (new FileWriter ("dateiname"));
und ersetzt System.out.println durch
Code:
bw.write ("wasauchimmer");
bw.newLine();
Und Streams bzw. Reader und Writer immer am Ende schließen :!:
also am Schluss noch ein
Code:
bw.close();
einbauen.
Ein BufferedWriter benutzt einen internen Puffer zum Schreiben, deshalb ist das bei langen Texten schneller. Außerdem sind Reader bzw. Writer leichter handzuhaben, wenn man eh nur mit Strings hantiert.
 
Oder du verwendest StringBuffer mit append, ist dann etwas performanter 😉 Ansonsten werden ja zig String Objekte erzeugt *g*.
 
mic_checker hat gesagt.:
Oder du verwendest StringBuffer mit append, ist dann etwas performanter 😉 Ansonsten werden ja zig String Objekte erzeugt *g*.
Die werden eh erzeugt, auch beim StringBuffer.... :meld:
 
Also, der Code von mir sieht jetzt so aus:

Code:
public static void MehrfachBerechnung(long startZahl, long endZahl)
  {
    int zaehler = (int)(endZahl - startZahl)+1;
    long zahl = startZahl;

    while ( zaehler != 0 )
    {
      long cur = 0,sum = 0,var = 3,original = zahl;
      long laenge = String.valueOf(zahl).length();

      while(laenge-- > 0)
      {

        cur = zahl % 10;
        zahl /= 10;
        sum += cur * var;
        var = var == 3 ? 1 : 3;
      }

      String meinString = "";
      if(sum % 10 == 0)
        meinString += "\nDie Pruefziffer der Zahl " + original + " ist 0\n";
      else
        meinString += "\nDie Pruefziffer der Zahl " + original + " ist " + (10 - (sum % 10)) + "\n";
        
      zaehler = zaehler - 1;
      zahl = ++startZahl;
      
      writeFile (meinString, "test.txt", false);
    }
  }

Code:
public static boolean writeFile (String text, String filename, boolean append)
  {
    try
    {
      PrintStream openFile = new PrintStream( new FileOutputStream(filename, append));
      openFile.print(text);
      openFile.flush();
      openFile.close();
      return true;
    }
    catch(IOException ioe)
    {
      ioe.printStackTrace();
      return false;
    }
    catch(IndexOutOfBoundsException ibe)
    {
      ibe.printStackTrace();
      return false;
    }
  }

Er erstellt auch eine .txt Datei, aber wenn ich einen Zahlenraum angeben, zb 1000 - 1100, steht in der Datei dann nur das ergebnis von 1100...die davor nicht...des weiteren, wie lege ich fest, wo er die txt speichert ?

mfg
 
Illuvatar hat gesagt.:
Oder du machst am Anfang der Methode
Code:
BufferedWriter bw = new BufferedWriter (new FileWriter ("dateiname"));
und ersetzt System.out.println durch
Code:
bw.write ("wasauchimmer");
bw.newLine();
Und Streams bzw. Reader und Writer immer am Ende schließen :!:
also am Schluss noch ein
Code:
bw.close();
einbauen.
Ein BufferedWriter benutzt einen internen Puffer zum Schreiben, deshalb ist das bei langen Texten schneller. Außerdem sind Reader bzw. Writer leichter handzuhaben, wenn man eh nur mit Strings hantiert.


OK Illu, hab das jetzt auch mal probiert, das sieht auch ganz gut aus, allerdings sagt der Compiler mir in 6 fehlermeldungen das ich mögliche exceptions abfangen muss...nur wie , welche...exceptions sind auch nicht gerade das, was ich schon gut beherrsche *g*
 
So, nachdem ich ein bißchen rumprobiert habe, habe ich ein lauffähiges programm hinbekommen, auf Grundlage des Tipp vom Illu...Das mit der IOException hab ich schlichtweg durch probieren rausgefunden...und was soll ich sagen...es läuft 🙂

ähem und bei der datei, die er mir erstellt, macht er nach dem satz wie zb
Code:
Die Pruefziffer der Zahl 1124 ist 2
3 Zeichen dran, die der Editor nicht darstelklen kann und die dann als solch ein Kästchen gezeigt werden...was sind das für welche und wie bekomme ich die weg ?

mfg
 
deathbyaclown hat gesagt.:
meez hat gesagt.:
mic_checker hat gesagt.:
Oder du verwendest StringBuffer mit append, ist dann etwas performanter 😉 Ansonsten werden ja zig String Objekte erzeugt *g*.
Die werden eh erzeugt, auch beim StringBuffer.... :meld:
äh wie ?? nein bei StringBuffer werden keine String Objekte erzeugt.....
Doch :bae:
Code:
sb.append ("hello, world"/*das ist also kein String?;)*/);
Bloß werden da nicht so viele StringBuffer Objekte erzeugt.

@Destiny Na irgendwann solltest du ExceptionHandling (hm... CamelCase rulezz) aber mal lernen. Mach halt try-catch Block rum und fang IOException das müsste genügen.
 
ja, die IOException hab ich ja wie gesagt mit etwas probieren abgefangen...das programm läuft ja auch !

Mein letztes prob ist eher ein stylistisches...Wie oben geschrieben gibt der zwar die ganzen Sätze korrekt in eine .txt aus, aber an jedem Satz hängen hinten dran so 3 rechtecke...sowelche die kommen, wenn der das zeichen nicht kennt....wisst ihr an was das hängt und wie ich das wegebkomme ? weiss nicht woher er die zeichen nimmt....hier der jetzig code

Code:
public static void MehrfachBerechnung(long startZahl, long endZahl)
  {
    int zaehler = (int)(endZahl - startZahl)+1;
    long zahl = startZahl;
    
    try
    {
      BufferedWriter bw = new BufferedWriter (new FileWriter ("C:/Test/Zahlen.txt"));

      while ( zaehler != 0 )
      {
        long cur = 0,sum = 0,var = 3,original = zahl;
        long laenge = String.valueOf(zahl).length();

        while(laenge-- > 0)
        {
          cur = zahl % 10;
          zahl /= 10;
          sum += cur * var;
          var = var == 3 ? 1 : 3;
        }

        if(sum % 10 == 0)
        {
          bw.write ("\nDie Pruefziffer der Zahl " + original + " ist 0");
          bw.newLine();
        }
        else
        {
          bw.write ("\nDie Pruefziffer der Zahl " + original + " ist " + (10 - (sum % 10)));
          bw.newLine();
        }

        zaehler = zaehler - 1;
        zahl = ++startZahl;
      }
      bw.close();
    }
    catch (IOException e1)
    {
      System.out.println("Fehler");
    }
  }
 
ich persönlich nutz um txt zu schreiben den PrintWriter and dann einfach per println(....)...

den kann ich dir ans herz legen. Denke das \n z.b. hauts hier raus....
 
dann bau doch mal den code aus meinem letzen code um, so das ich sehe, wie man den PrintWriter nutzt 🙂
Wäre mir sehr geholfen mit !

[edit] Das entfernen der /n hat geholfen, herzlichen Dank ! [/edit]

mfg
 
nachtrag bzgl. PrintWriter
Code:
PrintWriter w = new PrintWriter("file.txt");
w.println("zeile 1");
w.println("zeile 2");
w.flush();
w.close();
 
Jetzt bin ich echt bissel verwirrt...also...der Code lief vorhin...manchaml hat er rumgemuckt und ich bekam eine IOExcepion, weshalb er mir nur Fehler ausgab, manchmal ging es...ich habe jetzt nichts geändert, aber bekomme nur noch Fehler...wie kann das angehen ?

Code:
public static void MehrfachBerechnung(long startZahl, long endZahl)
  {
    int zaehler = (int)(endZahl - startZahl)+1;
    long zahl = startZahl;

    try
    {
      BufferedWriter bw = new BufferedWriter (new FileWriter ("C:/Test/Zahlen.txt"));

      while ( zaehler != 0 )
      {
        long cur = 0,sum = 0,var = 3,original = zahl;
        long laenge = String.valueOf(zahl).length();

        while(laenge-- > 0)
        {
          cur = zahl % 10;
          zahl /= 10;
          sum += cur * var;
          var = var == 3 ? 1 : 3;
        }

        if(sum % 10 == 0)
        {
          bw.write ("\nDie Pruefziffer der Zahl " + original + " ist 0");
          bw.newLine();
        }
        else
        {
          bw.write ("\nDie Pruefziffer der Zahl " + original + " ist " + (10 - (sum % 10)));
          bw.newLine();
        }

        zaehler = zaehler - 1;
        zahl = ++startZahl;
      }
      bw.close();
    }
    catch (IOException e1)
    {
      System.out.println("Fehler");
    }
  }

Wo ist daran der Fehler ? ich gebe irgendeinen zahlenbereich ein und er spuckt nur noch den fehler....vorhin ging es aber genau so ?!?!
 
er wirft die IOException...hab auch rausgefunden warum: es liegt an dem pfad, wo er speichern soll....gebe ich da an C:/Datei.txt macht er fehler, wenn ich aber D:/Datei.txt mache, geht es...was soll denn das ?
 
Heisst deine Platte denn auch C:....? Ansonsten catch mal nicht allgemein einfach nur IOException, sondern auch "FileNotFoundException" etc.....dann siehst du genauer was Sache ist.
 
die FileNotFound ist doch eine UnterException der IOException.
ein simples e.printStackTrace() würde bei beiden Fällen die Antwort geben
 
ja sicher, entweder du machst es über printStackTrace() oder anders. Es ist absicht das es so ist. Wenn du die Unter-Klassen anfangs auflistest und am Ende erst IOException kannst du spezifischer feststellen welcher Fehler genau ausgelöst wurde.
Aber du hast recht....ein Stack Trace ist natürlich auch gut.
 
mic_checker hat gesagt.:
ja sicher, entweder du machst es über printStackTrace() oder anders. Es ist absicht das es so ist. Wenn du die Unter-Klassen anfangs auflistest und am Ende erst IOException kannst du spezifischer feststellen welcher Fehler genau ausgelöst wurde.
Aber du hast recht....ein Stack Trace ist natürlich auch gut.

oO Da ich in Sachen Exceptions nicht sehr bewandert bin - wie bitte ? ^^
 
Code:
try 
{
    //blupp
}
catch(IOException ex)
{
    ex.printStackTrace();
}

printStackTrace ist Mindeste was man in catch-Blöcken machen sollte.
[edit]@Destiny kannst du deine Sig nicht mal ein bisschen kleiner machen?![/edit]
 
Und warum ist es das mindeste ? Was macht es denn ?

Wenn ich daheim bin, mach ich das pic kleiner und lade es hoch....

mfg

[edit] nach einbau bekomm ich jetzt, wenn ich auf c speichern will, folgendes ergebnis:

Code:
java.io.FileNotFoundException: C:\Zahlen.doc <Zugriff verweigert>
at java.io.FileOutputStream.open <Native Method>
at java.io.FileOutputStream.<init><FileOutputStream.java:179>
at java.io.FileOutputStream.<init><FileOutputStream.java:70>
at java.io.FileWriter.<init><FileWriter.java:46>
at PruefZiffer4.MehrfachBerechnung<PruefZiffer4.java:193>
at PruefZiffer4.main<PruefZiffer4.java:23>

wenn ich statt c: einfach d: angeben, gehts -.- was soll das :< [/edit]
 
die erklärungen von java sind beschissen, ich mag es lieber (und versteh es besser) wenn ich das hier erklärt bekomme, auch weil es hier in deutsch ist und nicht so hochtrabend geschrieben ist....
 
Hat denn immer noch niemand eine erklärung für mich, warum der nicht auf c: aber auf d: speichern kann ?
 
Destiny1985 hat gesagt.:
Und warum ist es das mindeste ? Was macht es denn ?
Code:
java.io.FileNotFoundException: C:\Zahlen.doc <Zugriff verweigert>
at java.io.FileOutputStream.open <Native Method>
at java.io.FileOutputStream.<init><FileOutputStream.java:179>
at java.io.FileOutputStream.<init><FileOutputStream.java:70>
at java.io.FileWriter.<init><FileWriter.java:46>
at PruefZiffer4.MehrfachBerechnung<PruefZiffer4.java:193>
at PruefZiffer4.main<PruefZiffer4.java:23>

Also zum Anfang erstmal eins: DU wirst dich wohl oder übel mit der Java API anfreunden müssen, denn sie ist dein Freund 😉

Existiert die Datei "C:\Zahlen.doc" ? Scheinbar nicht, da der Compiler eine FNFE Exception ausschmeisst, d.h. er kann die Datei nicht finden, in der Regel weil sie nicht existiert. Dafür scheint auf D:\ eine Datei namens Zahlen.doc zu existieren wenn es damit ohne Exception klappt.
 
Negativ :> Die Datei befindet sich vorher weder auf C noch auf D. Auf D erstellt er mir Datei dann aber, auf C tut er das nicht...
 
Illuvatar hat gesagt.:
deathbyaclown hat gesagt.:
meez hat gesagt.:
mic_checker hat gesagt.:
Oder du verwendest StringBuffer mit append, ist dann etwas performanter 😉 Ansonsten werden ja zig String Objekte erzeugt *g*.
Die werden eh erzeugt, auch beim StringBuffer.... :meld:
äh wie ?? nein bei StringBuffer werden keine String Objekte erzeugt.....
Doch :bae:
Code:
sb.append ("hello, world"/*das ist also kein String?;)*/);
Bloß werden da nicht so viele StringBuffer Objekte erzeugt.

Ja, das ist ja klar, hab ich etwas anderes im Post geschrieben ? Nicht das ich wüsste 😉 Bei der String Konkatenation werden die intern ja auch in StringBuffer umgewandelt und jeweils immer angehangen (oder ?), somit ist der direkte Einsatz von nem StringBuffer performanter.

@Destiny: Kannst du bitte nochmal deinen aktuellen kompletten Code posten?
 
Japp, hier ist die Methode die nicht macht wie sie soll :>

Code:
public static void MehrfachBerechnung(long startZahl, long endZahl)
  {
    int zaehler = (int)(endZahl - startZahl)+1;
    long zahl = startZahl;
    
    try
    {
      BufferedWriter bw = new BufferedWriter (new FileWriter ("D:/Zahlen.doc"));

      while ( zaehler != 0 )
      {
        long cur = 0,sum = 0,var = 3,original = zahl;
        long laenge = String.valueOf(zahl).length();

        while(laenge-- > 0)
        {
          cur = zahl % 10;
          zahl /= 10;
          sum += cur * var;
          var = var == 3 ? 1 : 3;
        }

        if(sum % 10 == 0)
        {
          bw.write ("\nDie Pruefziffer der Zahl " + original + " ist 0");
          bw.newLine();
        }
        else
        {
          bw.write ("\nDie Pruefziffer der Zahl " + original + " ist " + (10 - (sum % 10)));
          bw.newLine();
        }

        zaehler = zaehler - 1;
        zahl = ++startZahl;
      }
      bw.close();
    }
    catch (IOException e)
    {
      e.printStackTrace();
    }
  }
 
Also ich hab jetzt mit folgendem kleinen Testprog das ganze getestet:

Code:
import java.io.*;

public class Pruefziffer {
	public static void main(String[] args) {
		MehrfachBerechnung(220,230);
	}
	
	public static void MehrfachBerechnung(long startZahl, long endZahl)
  	{
    int zaehler = (int)(endZahl - startZahl)+1;
    long zahl = startZahl;
   
    try
    {
      BufferedWriter bw = new BufferedWriter (new FileWriter ("C:/Zahlen.doc"));

      while ( zaehler != 0 )
      {
        long cur = 0,sum = 0,var = 3,original = zahl;
        long laenge = String.valueOf(zahl).length();

        while(laenge-- > 0)
        {
          cur = zahl % 10;
          zahl /= 10;
          sum += cur * var;
          var = var == 3 ? 1 : 3;
        }

        if(sum % 10 == 0)
        {
          bw.write ("\nDie Pruefziffer der Zahl " + original + " ist 0");
          bw.newLine();
        }
        else
        {
          bw.write ("\nDie Pruefziffer der Zahl " + original + " ist " + (10 - (sum % 10)));
          bw.newLine();
        }

        zaehler = zaehler - 1;
        zahl = ++startZahl;
      }
      bw.close();
    }
    catch (IOException e)
    {
      e.printStackTrace();
    }
  }
}

Bei mir existiert vor Start weder auf C noch auf D "Zahlen.doc", wenn ich es mit beiden Varianten ausprobier legt er auf beiden Platten das Dokument an, ohne FileNotFoundException!
 
uhm...hmm...vllt liegt es daran das ich mit meinem benutzerkonto irgendwelche rechte auf c nicht habe...who knows...muss das ganze mal daheim am PC testen :< Ist halt nur blöd, da das programm für die Arbeit ist, und ich wollt halt das er die File auf dem Desktop direkt erzeugt (damit meine armen Kollegen die ich mal ganz nett PC-b00ns nenne *g*) die Datei auch direkt finden immer...hmm -.-

Naja aber danke für's nachgucken !
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben