2013-08-12 76 views
1

我有一個文本文件「test.txt」,用於存儲學生的詳細信息,例如I.D號和所採取的課程。 我希望在「LASTSTUDENTEENTRYLINE」之前立即添加新學生。 我遇到的問題是我正在收集名爲「objectInputFieldsList」的數組列表中的學生詳細信息。我一直試圖用「objectInputFieldsList」+「LASTSTUDENTEENTRYLINE」替換「LASTSTUDENTEENTRYLINE」。 問題是兩個不混合 - 一個是數組列表,另一個是字符串。數組列表包含來自用戶的文本字段值的輸入。 如何成功解決此問題並用「objectInputFieldsList」+「LASTSTUDENTEENTRYLINE」替換LASTSTUDENTEENTRYLINE? 非常感謝大家提前。如何使用用戶輸入的ArrayList替換文本文本的字符串

這裏是我到目前爲止一直在想:更新之前

示例文本文件:

123 | Oliver | Muchai 
456 | Revilo | Chamu 
LASTSTUDENTEENTRYLINENNAMES 

Classes | 123 | English 
Classes | 456 | Bilogy 
LASTSTUDENTEENTRYLINENSUBJECTS 

更新之後用一個新的用戶文本文件應看:

123 | Oliver | Muchai 
456 | Revilo | Chamu 
678 | Eddys | Rockery 
LASTSTUDENTEENTRYLINENNAMES 

Classes | 123 | English 
Classes | 456 | Biology 
Classes | 678 | Kiswahili 
LASTSTUDENTEENTRYLINENSUBJECTS 

代碼:

 // The ArrayList called from the class that gets the user input from the JTextFields 
     AddNewClientSaveAction save = new AddNewClientSaveAction(); 
     StringBuffer sb = new StringBuffer(); 


     String lastNames = "LASTSTUDENTEENTRYLINENNAMES "; 
     String lastSubject = "LASTSTUDENTEENTRYLINENSUBJECTS"; 

     String textToEdit1 = lastNames; 
     int cnt1 = sb.indexOf(textToEdit1); 
     String replacementString1 = "\n" + save + "\n" + lastNames; 
     sb.replace(cnt1,cnt1+textToEdit1.length(), replacementString1); 
+0

什麼'sb'在你的代碼更好?你可以發佈'sb.replace(....)'方法! – Azad

+0

@Azad我的猜測是'StringBuilder' .... – MadProgrammer

+0

對不起:StringBuffer sb = new StringBuffer(); –

回答

1

這不是一個完整或完整的解決方案,而是一個概念的一個例子

這是假設你正在閱讀的所有文字從下手......生活將顯着更多的困難,如果你」不是。

這基本上使用StringBuilder#indexOf找到索引點,其中特定String文字存在。在這個例子中,我們只想找LASTSTUDENTEENTRYLINENNAMES,但應該明白了吧...

從那裏,每一個新的記錄行,我們創建一個臨時String要插入,然後以前取得的索引之前插入此點....

現在。它不會是在科目增加,以及一件很難的事情......

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 

public class FileUpdate { 

    public static final String LAST_STUDENT_LINE = "LASTSTUDENTEENTRYLINENNAMES"; 

    public static void main(String[] args) { 

     StringBuilder sb = new StringBuilder(128); 
     List<Student> objectInputFieldsList = new ArrayList<>(25); 
     objectInputFieldsList.add(new Student(128, "Banana", "Pajamas")); 

     BufferedReader br = null; 
     try { 

      br = new BufferedReader(new FileReader("test.txt")); 
      String text = null; 
      while ((text = br.readLine()) != null) { 
       if (sb.length() > 0) { 
        sb.append("\n"); 
       } 
       sb.append(text); 
      } 

      System.out.println("Before"); 
      System.out.println(sb); 

      for (Student s : objectInputFieldsList) { 

       int insertIndex = sb.indexOf(LAST_STUDENT_LINE); 
       StringBuilder line = new StringBuilder(128); 
       line.append(s.getId()).append(" | ").append(s.getFirstName()).append(" | ").append(s.getLastName()).append("\n"); 
       sb.insert(insertIndex, line.toString()); 

       // Find subject mark and add the students subjects in as well... 

      } 

      System.out.println("\nAfter"); 
      System.out.println(sb); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       br.close(); 
      } catch (IOException exp) { 
      } 
     } 

    } 

    public static class Student { 

     private int id; 
     private String firstName; 
     private String lastName; 

     public Student(int id, String firstName, String lastName) { 
      this.id = id; 
      this.firstName = firstName; 
      this.lastName = lastName; 
     } 

     public int getId() { 
      return id; 
     } 

     public String getFirstName() { 
      return firstName; 
     } 

     public String getLastName() { 
      return lastName; 
     }    
    } 
} 

此輸出......

Before 
123 | Oliver | Muchai 
456 | Revilo | Chamu 
LASTSTUDENTEENTRYLINENNAMES 

Classes | 123 | English 
Classes | 456 | Bilogy 
LASTSTUDENTEENTRYLINENSUBJECTS 

After 
123 | Oliver | Muchai 
456 | Revilo | Chamu 
128 | Banana | Pajamas 
LASTSTUDENTEENTRYLINENNAMES 

Classes | 123 | English 
Classes | 456 | Bilogy 
LASTSTUDENTEENTRYLINENSUBJECTS 

現在......做完這一切...

我建議使用一個用戶數據庫,像H2例如,甚至是XML,它必須是顯著更容易,很多長錯少凌亂 - 恕我直言

+0

非常感謝答案,但我認爲你得到了關於示例文本文件錯誤的部分。這兩部分顯示了相同文本文件的前後部分。 –

+0

還有一行'128 |香蕉|睡衣「,它以2行結束,3行學生開始。我只是懶得添加類,不能爲你做所有事情;) – MadProgrammer

1

由於它是Java ArrayList,因此可以使用ArrayList#add(int index, E element)方法在列表中的指定位置插入元素。

用作index包含行尾「lastName」的元素之前的索引。

這種解決方案如果你想在ArrayList裏面添加字符串。

+0

什麼是AddNewClientSaveAction? – azzurroverde

+0

這是一個類,它從JTextFields收集用戶輸入,並將它們放入一個ArrayList中,通過上面的代碼存儲在文本文件中(我已經排除了上面代碼存在的類的其他部分) –

0

如果我理解你的權利,您希望在「LATSTUDENTTEENTRYLINE」之前將新學生寫入您的「test.txt」中。

首先把你的整個txt放到一個StringBuffer中,因爲你的能夠寫在一個特殊的索引處。

使用

sb.getIndexOf("LASTSTUDENTEENTRYLINE"); 

,讓你想添加

String line = "Student | foo | bar"; 
int index = line.length(); 

你的字符串的大小,現在你有

sb.getIndexOf("LASTSTUDENTTEENTRYLINE") - index; 
在你的StringBuffer

寫就行了。 最後,您將整個StringBuffer寫入txt。 也許你有你的線

+ "\n" 

投入,使新線,所以它看起來在TXT

相關問題