J'ai donc une classe Java de Konto, qui a:

private String navn;
private int medlemdsnummer;
private String årstal;
private String måned;
private String dag;
LocalDate localDate;

Ils sont utilisés comme ceci:

ArrayList<Konto> kontoArrayList = new ArrayList<>();

Et j'enregistre ma ArrayList dans un document .txt avant l'arrêt du programme:

private static void saveToFile(ArrayList<Konto> kontoArrayList) throws IOException {

    String content = new String(Files.readAllBytes(Paths.get("medlemmer.txt")));
    PrintStream printStream = new PrintStream("medlemmer.txt");

    for (int i = 0; i < kontoArrayList.size(); i++) {

        printStream.println(content + kontoArrayList.get(i).getMedlemdsnummer() + ": " + kontoArrayList.get(i).getNavn() + " " +
                kontoArrayList.get(i).getLocalDate());

    }


}

Ils finissent par ressembler à ceci dans le fichier .txt:

1: Kasper 1996-11-20
2: Jonas 1996-04-27
3: Jesper 1996-05-14

D'accord, jusqu'ici tout va bien. Maintenant, pour la question: lorsque le programme est activé, je veux le rendre capable de charger le fichier .txt depuis le début et de le «transférer» vers un ArrayList de Konto. Pour que je puisse plus tard utiliser ma méthode (addNewMember). J'ai vu beaucoup d'exemples sur Internet, mais ils utilisent tous:

ArrayList<String> somename = new ArrayList<String>();

Je veux utiliser:

ArrayList<Konto> konto = new ArrayList<Konto>();

Est-ce possible, si oui comment faire? Si non, que puis-je faire à la place?

Merci d'avance, Victor.

3
user8767767 26 nov. 2017 à 13:06

3 réponses

Meilleure réponse

Vous pouvez lire toutes les lignes du fichier sous forme de chaîne et diviser ces chaînes par des espaces. Et puis créez de nouveaux objets avec l'analyse des options. Quelque chose comme ça:

List<String> strings = Files.readAllLines(Paths.get("test.txt"));
List<Konto> kontos = new ArrayList<>();
for (String string : strings) {
    String[] data = string.split(" ");
    kontos.add(new Konto(data[1], new Date(data[2])));
}

Ou en utilisant Stream s:

List<Konto> kontos = Files.lines(Paths.get("test.txt"))  // String
    .map(line -> line.split(" "))                        // String[]
    .map(data -> new Konto(data[1], new Date(data[2]))   // Konto
    .collect(Collectors.toList());
0
Zabuzard 26 nov. 2017 à 12:58

Je pense qu'une façon que vous pouvez essayer est de lire ligne par ligne et de définir un constructeur Konto qui accepte une chaîne.

Edit: Vous pouvez suivre la réponse ci-dessous de Lucem. Mais je pense que je vais le faire un peu différemment

List<String> strings = Files.readAllLines(Paths.get("fileName.txt"));
List<Konto> kontos = new ArrayList<>();
for (String s: strings) {
    kontos.add (new Konto(s))
}

Ou en utilisant Stream s:

List<Konto> kontos = Files.lines(Paths.get("fileName.txt"))
    .map(line -> new Konto(line));
    .collect(Collectors.toList());

Et puis dans la classe Konto, ajoutez un constructeur qui accepte une chaîne et la manipule. Parce que vous n'avez pas ajouté la classe Konto ici, je ne connaissais pas le nom exact de vos propriétés, donc je l'ai laissé être "yourPropertyNumber", "yourPropertyString" et "yourPropertyDate"

class Konto {
    public Konto (String input) {
        // Split based on white space 
        String[] dataParts = input.split(" ");

        // Get rid of the semicolon
        String number = dataParts[0].substring(0, dataParts[0].length - 1);
        yourPropertyNumber = parseInt(number);
        yourPropertyString = dataParts[1];
        yourPropertyDate = new Date(dataParts[2]);
    }
    // Your other code here
}

La raison pour laquelle je veux passer une chaîne à un constructeur plutôt que d'analyser la chaîne où je lis le fichier est que je pense qu'il est plus facile de déboguer ou de modifier la façon dont il lit la chaîne.

J'espère que cette aide.

0
Zabuzard 26 nov. 2017 à 13:03

Quelque chose comme ce qui suit, vous devez le vérifier

class TestParse {
    public TestParse(String line) {
        StringTokenizer tokenizer = new StringTokenizer(line, ",");

        if(tokenizer.countTokens() != 3) {
            throw new RuntimeException("error");        
        }

        s1 = tokenizer.nextToken();
        s2 = tokenizer.nextToken();
        s3 = tokenizer.nextToken();
    }

    private String s1;
    private String s2;
    private String s3;
}

public class TestRead {
    public static void main(String[] args) throws Exception {
        List<TestParse> testParses = new ArrayList<TestParse>();

        BufferedReader in = new BufferedReader(new FileReader("file.txt"));

        String line;

        while((line = in.readLine()) != null) {
            testParses.add(new TestParse(line));
        }

        in.close(); 
    }
}
0
Abdul Ahad 26 nov. 2017 à 11:11
47494958