2016-05-15 5 views
1

Ich habe versucht, die Antwort zu diesem Thema, aber ich konnte nicht durch die Suche ein paar verschiedene Dinge. Bitte entschuldigen Sie, wenn ich etwas nicht richtig formatiere, dies ist mein erster Beitrag hier.Drucken von Datei nach dem Schreiben von Java

so dass ich schreibe ein Programm in Java im Grunde eine Aufzeichnung der Klettergeschichte des Benutzers auf verschiedenen Strecken und Schwierigkeiten halten.

Ich habe ein Problem mit dem Schreiben in eine Textdatei (ich bin noch neu zu FileIO) wo nach dem Schreiben in die Datei, die neue Information, die geschrieben wird, wird nicht gedruckt, bis ich das Programm beenden und neu starten es. Hier ist das Programm, ist die Methode in Frage writer():

public class Climb { 
    private String name; 
    private char type; 
    private double rating; 
    private char subRating; 
    private String loc; 
    private int tries; 


    public Climb(){} 

    public Climb(String name, char type, double rating, char subRating, String loc, int tries) { 
     this.name = name; 
     this.type = type; 
     this.rating = rating; 
     this.subRating = subRating; 
     this.loc = loc; 
     this.tries = tries; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public char getType() { 
     return type; 
    } 

    public void setType(char type) { 
     this.type = type; 
    } 

    public double getRating() { 
     return rating; 
    } 

    public void setRating(double rating) { 
     this.rating = rating; 
    } 

    public String getLoc() { 
     return loc; 
    } 

    public void setLoc(String loc) { 
     this.loc = loc; 
    } 

    public int getTries() { 
     return tries; 
    } 

    public void setTries(int tries) { 
     this.tries = tries; 
    } 

    public char getSubRating() { 
     return subRating; 
    } 

    public void setSubRating(char subRating) { 
     this.subRating = subRating; 
    } 

    public static String header(){ 
     return String.format("%-10s %-10s %-10s %-10s %-10s","Name","Type","Rating","Location","Attempts"); 
    } 

    @Override 
    public String toString() { 
     String tempRating = Double.toString(rating) + subRating; 
     return String.format("%-10s %-10s %-10.5s %-10s %-10s %n", name, type, tempRating, loc, tries); 
    } 
} 

public class ClimbTracker { 
    /* 
    * prints a formatted output of an array of Climb objects 
    */ 
    public static void printRecord (Climb[] c) { 
     try { 
      System.out.println(Climb.header()); 
      for (int i = 0; i < c.length; i++){ 
       System.out.print(c[i].toString()); 
      } 
     } 
     catch (NullPointerException ex) { 
      System.out.println("Error: " + ex.getMessage()); 
     } 
    } 

    /* 
    * Creates a new array of Climb objects from a file and return the array. 
    * Number of objects in file doesn't need to be known 
    */ 
    public static Climb[] objFromFile (File fn){ 
     try { 
      Scanner file = new Scanner(fn); 
      ArrayList<Climb> climbsArray = new ArrayList<>(); 
      Climb[] climbObjArray; 
      while (file.hasNext()) { 
       // name, type, rating, subRating, location, tries 
       String name = file.next(); 
       char type = file.next().charAt(0); 
       String temp = file.next(); 
       char subRating; 
       double rating; 
       /* 
       * This if block is to deal with the problem that climbing 
       * ratings are often something like "5.12a", so it splits it 
       * into a double and a char as rating and subRating respectively 
       */ 
       if (temp.length() > 3){ 
        subRating = temp.charAt((temp.length() -1)); 
        temp = temp.substring(0, temp.length() -1); 
        rating = Double.parseDouble(temp); 
       } else { 
        rating = Double.parseDouble(temp); 
        subRating = ' '; 
       } 
       String loc = file.next(); 
       int tries = file.nextInt(); 
       Climb climb1 = new Climb(name,type,rating,subRating,loc,tries); 
       climbsArray.add(climb1); 
      } 
      climbObjArray = new Climb[climbsArray.size()]; 
      for (int i = 0; i < climbsArray.size(); i++) { 
       climbObjArray[i] = climbsArray.get(i); 
      } 
      return climbObjArray; 
     } 
     catch (FileNotFoundException ex){ 
      System.out.println("Error " + ex.getMessage()); 
     } 
     return null; 
    } 

    /* 
    * Will write new climbs to the file 
    */ 
    public static void writer (File fn, Scanner input){ 
     try { 
      FileOutputStream fn_stream = new FileOutputStream(fn,true); 
      PrintWriter out = new PrintWriter(fn_stream); 
      System.out.print("Name of route: "); 
      out.print(input.next() + " "); 
      System.out.print("(B)ouldering or (t)oprope: "); 
      out.print(input.next().charAt(0) + " "); 
      System.out.print("Rating: "); 
      out.print(input.next() + " "); 
      System.out.print("Location of route: "); 
      out.print(input.next() + " "); 
      System.out.print("Number of attempts: "); 
      out.print(input.next() + "\n"); 
      out.flush(); 
      fn_stream.flush(); 
      out.close(); 
      fn_stream.close(); 
     } catch (FileNotFoundException ex) { 
      System.out.println("Error: " + ex.getMessage()); 
     } catch (IOException ex) { 
      System.out.println("Error: " + ex.getMessage()); 
     } finally { 
      objFromFile(fn); 
     } 
    } 

    public static void main(String[] args) { 
     File fn = new File("climbs.txt"); 
     Scanner input = new Scanner(System.in); 
     Climb[] c = objFromFile(fn); 
     while (true) { 
      System.out.println("What would you like to do?"); 
      System.out.println("(P)rint recent climbs"); 
      System.out.println("(W)rite others"); 
      System.out.println("(E)xit"); 
      char option = input.next().charAt(0); 
      switch (option){ 
       case 'p': 
        printRecord(c); 
        break; 
       case 'w': 
        writer(fn, input); 
        break; 
       case 'e': 
        System.exit(0); 
        break; 
       default: 
        System.out.println("That isn't an option"); 
      } 
     } 
    } 
} 

Das Verfahren in dem finally-Block liest die Datei und erstellt ein ArrayList von Objekten und speichert es dann in einem Array von Objekten für den Druck und andere Sachen.

Ich glaube nicht, dass das Problem sein sollte, da es das gleiche Datei-Objekt verwendet. Es sei denn, ich muss das Dateiobjekt nach dem Schreiben neu erstellen?

+0

Sie haben den zeigen Quelle von 'objFromFile()' sowie –

+0

In Ordnung habe ich auch in der 'objFromFile() 'Methode hinzugefügt. –

+1

Ich habe versucht, Ausführen und Debuggen Code mit einem Dummy 'Climb' Klasse mit Nichtstun Konstruktor und es scheint zu funktionieren: Eingang in die Standardausgabe in einer angemessenen Frist und Ausgabe an die Datei ausgegeben wird, ist in der Zeit dort für' objFromFile (Datei) 'um es erfolgreich zu lesen. Könnten Sie bitte genauer erläutern, was im obigen Code nicht funktioniert? –

Antwort

0

das Array Sie drucken (wenn aus dem Menü wählen) ist die in main die Climb[] c ist, während der ein/aufgefrischt nach writer() geladen werden genannt wird, ist ein anderer es in objFromFile() gelegen ist, so laden Sie in ein Array und Drucken eines anderen Climb[] climbObjArray.

so schlage ich vor, Sie den finally Block entfernen, und rufen Sie objFromFile() in Ihrem main in dem Fall, dass write so das Array Matcher in main aktualisiert wird, wird somit korrekt gedruckt werden, wenn der Benutzer Funktion wählt print

1- Entfernen Dieser Block aus writer()

finally { 
    objFromFile(fn); 
} 

2- Update case 'w' wie folgend:

case 'w': 
    writer(fn, input); 
    c = objFromFile(fn); // <--- add this 
    break; 

jetzt, wenn case 'p' übereinstimmt, wird Aufruf printRecord(c); übergeben aktualisiert c.

PS: eine bessere apprach ArrayList in eine Array umgewandelt wird unter Verwendung von toArray() anstelle der for-Schleife

climbObjArray = climbsArray.toArray(new Climb[climbsArray.size()]); 

ersetzen die for-Schleife und Array climbObjArray Initialisierung mit oberhalb der Linie

Verwandte Themen