2017-11-26 3 views
3

の物乞いに.txtファイルからのArrayListにファイルだから私は持っKontoのJavaクラスを、得た:は読み取りプログラム

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

彼らは、このように使用されています

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

そして私は、保存しますプログラムのシャットダウン前に.txtの文書への私のArrayList:彼らは.txtファイルでこのように見える終わる

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()); 

    } 


} 

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

これまでのところ良いです。プログラムの電源が入ったら、最初から.txtファイルを読み込み、KontoのArrayListに "転送"できるようにしたいのです。だから私は後で私のメソッド(addNewMember)を使用することができます。私は、インターネット上の例をたくさん見ましたが、それらはすべて使用:

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

私が使用したい:ので、どのように行う場合

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

は、可能なこのですか? 私は代わりに何をすることができますか?

ありがとうございます、ビクター

答えて

1

をチェックするようになってきました。 そして、オプションの解析で新しいオブジェクトを作成します。このような 何か:

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]))); 
} 

それともStreamの使用:あなたは私を見ることができるだろう

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

クラス「日付」はレガシーであることに注意してください。 'java.time'パッケージのクラスを代わりに使用してください。 – Zabuza

1

私はあなたが試みることができる方法の1つは、行ごとに読み込まれ、文字列を受け入れるKontoコンストラクタを定義すると思います。

編集:Lucemの下記の回答に従うことができます。

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

そしてKontoクラス内の文字列を受け入れ、それを操作するコンストラクタを追加します。しかし、私はそれを少し異なる

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

またはStream Sを使用して操作を行うと思います。あなたがここにクラスKontoを追加しませんでしたので、私はあなたの特性の正確な名前を知らなかったので、私はそれが「yourPropertyNumber」、「yourPropertyString」と「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 
} 

私が欲しい理由を聞かせてファイルを読み込んだ文字列を解析するのではなく、コンストラクタにStringを渡すことは、文字列を読み込む方法をデバッグしたり変更したりする方が簡単だと思います。

このヘルプが必要です。次のような

+0

を? 今私は学生ですが、それほど多くの経験はまだありません:) – Mango

+0

私は私の恥ずかしそうな表情をはっきりさせるために編集しました。私はプロではありませんが、それがあなたを助けることを願っています。がんばろう。 – LdBach

1

何かが、あなたは、文字列としてファイルからすべての行を読んで、スペースで、この文字列を分割することができ、それを

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

最近、** NIO **と呼ばれるJavasの新しいI/O APIを使用してファイルを読む必要があります。クラス 'Files'、' Paths'、 'Path'を中心にしています。 – Zabuza

+0

'new RuntimeException(" error ")の代わりに' new IllegalArgumenException( "不正なトークンの量") 'のようなものを投げてもよいでしょう。 – Zabuza

+0

ありがとう、私はNIOを見ていきます。例外のために、ええ。エラー処理を行わずにエラーが発生した場合の例です。 –

関連する問題