2016-06-27 15 views
2

Ich habe versucht, eine ArrayList in eine Datei zu speichern. Ich kann sehen, dass es die Textdatei erstellt, aber nichts wird in die Textdatei eingefügt, nur leer.ArrayList in Textdatei speichern

Hier ist der Hauptcode mit der ArrayList, Switch mit Option zu speichern.

static int input, selection, i = 1; 
static ArrayList<Animals> a; 

// Main Method 
public static void main(String[] args){ 

    // Create an ArrayList that holds different animals 
    a = new ArrayList<>(); 
    a.add(new Animals(i++, "Bear", "Vertebrate", "Mammal")); 
    a.add(new Animals(i++, "Snake", "Invertebrate", "Reptile")); 
    a.add(new Animals(i++, "Dog", "Vertebrate", "Mammal")); 
    a.add(new Animals(i++, "Starfish", "Invertebrates", "Fish")); 

    while (true) { 
     try { 
      System.out.println("\nWhat would you like to do?"); 
      System.out.println("1: View List\n2: Delete Item\n3: Add Item\n4: Edit Item\n5: Save File\n0: Exit"); 
      selection = scanner.nextInt(); 
      if(selection != 0){ 
       switch (selection) { 
        case 1: 
         ViewList.view(); 
         Thread.sleep(4000); 
         break; 
        case 2: 
         Delete.deleteItem(); 
         Thread.sleep(4000); 
         break; 
        case 3: 
         Add.addItem(); 
         Thread.sleep(4000); 
         break; 
        case 4: 
         Edit.editItem(); 
         Thread.sleep(4000); 
         break; 
        case 5: 
         Save.saveToFile("animals.txt", a); 
         Thread.sleep(4000); 
         break; 

Dies ist, was ich geschrieben habe, um Datei zu behandeln. Hier

import java.io.IOException; 
import java.nio.charset.Charset; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.util.ArrayList; 

public class Save extends ALProgram{ 
    public static void saveToFile(String fileName, ArrayList list){ 
      Path filePath = Paths.get(fileName); 
      try{ 
       System.out.println("File Saved"); 
       Files.write(filePath, list, Charset.defaultCharset()); 
      }catch(IOException e){ 
       e.printStackTrace(); 
      } 

    } 
} 

ist Tier Klasse

class Animals { 

public int id; 
public String type, vertebrate, aclass; 

public Animals(int id, String type, String vertebrate, String aclass) { 
    this.id = id; 
    this.type = type; 
    this.vertebrate = vertebrate; 
    this.aclass = aclass; 

} 

public int getID() { 
    return id; 
} 

public String getType() { 
    return type; 
} 

public String getVert() { 
    return vertebrate; 
} 

public String getaclass() { 
    return aclass; 
} 

} 
+0

Wenn Sie Generics für den Parameter 'ArrayList' für' saveToFile' verwenden, wird ein Typfehler in 'Files.write' angezeigt, der das Problem verursacht. – 4castle

+0

Bitte geben Sie "Tiere" Klasse für mich und ich werde Ihnen bei der Lösung helfen. – NulledCoder

+0

@NulledCoder Ich habe eine Klasse zum Bearbeiten hinzugefügt –

Antwort

3

Es gibt zwei Änderungen außer Kraft zu setzen:

Notwendigkeit
  1. Ihre Klasse CharSequence zu implementieren, um Files.write bestanden in Frage zu kommen werden.
  2. Sie müssen die toString-Methode überschreiben, um anzugeben, wie Ihre Inhalte beim Speichern aussehen. Ich kann die Ausgabe nach den obigen zwei Änderungen sehen.

    class Animals implements CharSequence { 
    
         public int id; 
         public String type, vertebrate, aclass; 
    
    public Animals(int id,String type,String vertebrate,String aclass) { 
    this.id = id; 
    this.type = type; 
    this.vertebrate = vertebrate; 
          this.aclass = aclass; 
         } 
    
         public int getID() { 
          return id; 
         } 
    
         public String getType() { 
          return type; 
         } 
    
         public String getVert() { 
          return vertebrate; 
         } 
    
         public String getaclass() { 
          return aclass; 
         } 
    
         @Override 
         public int length() { 
          return toString().length(); 
         } 
    
         @Override 
         public char charAt(int index) { 
          return toString().charAt(index); 
         } 
    
         @Override 
         public CharSequence subSequence(int start, int end) { 
          return toString().subSequence(start, end); 
         } 
    
         /* (non-Javadoc) 
         * @see java.lang.Object#toString() 
         */ 
         @Override 
         public String toString() { 
          return "Animals [id=" + id + ", type=" + type + ", vertebrate=" + vertebrate + ", aclass=" + aclass + "]"; 
         } 
    
    
         } 
    
+0

Das funktioniert perfekt, ich sehe viel besser, was ich falsch gemacht habe. Vielen Dank! –

1

Sie schreiben konnte nur Iterable<? extends CharSequence>, so dass Sie Code ändern, wie unten.

Bitte stellen Sie sicher, toString Methode der Animal Klasse

List<Animal> animals = new ArrayList<>(); 
    Animal a1 = new Animal(1L, "XYZ", "A2B"); 
    Animal a2 = new Animal(2L, "ABC", "IJK"); 
    animals.add(a1); 
    animals.add(a2); 
    List<String> strings = new ArrayList<>(); 
    for (Animal animal : animals) { 
     strings.add(animal.toString()); 
    } 
    Files.write(Paths.get("output.out"), strings, Charset.defaultCharset()); 
+0

Sie würden auf diese Weise Hashes in die Datei drucken. – kazenorin

+0

Ich habe 'toString' überschrieben, vergaß zu erwähnen, Danke, bearbeitete Antwort – Saravana

2

Also, erster, können Sie es nicht nur sparen, indem es in einem String Gießen. Sie müssen jedes Element erhalten, eine Zeichenfolge obly erstellen und dann in die Datei schreiben. Hier ist ein Beispiel:

public static void saveToFile(String fileName, ArrayList<Animal> list){ 

StringBuilder sb = new StringBuilder(); 

for(int i=0; i<=list.size(); i++) { 
Animal lAn = list.get(i); 
sb.Append("Animal ID: "+lAn.getID()+"; Animal type: "+lAn.getType()+"; Animal vert: "+lAn.getVert()+"; Animal aclass: "+lAn.getaclass()+"\r\n"); 
} 

try (PrintStream out = new PrintStream(new FileOutputStream(fileName))) { out.print(sb.toString()); } 

} catch(IOException e){ e.printStackTrace(); } } 

es versuchen. Theres konnte auch einige Fehler/Mispelling sein, weil ich diesen Code von meinem Telefon schrieb.

Verwandte Themen