2015-11-11 125 views
2

我正在研究一個項目,我需要從文件中讀取文本,然後將特定部分存儲爲變量。從文件讀取 - Java

說我有文本文件example.txt中

John 
Smith 
32 
1991 

我會想的第一行指定爲:

String firstName; -> John 

等。

我有這個到目前爲止。

public void load(String fileName){ 
    BufferedReader br = null; 

    try { 

     String sCurrentLine; 

     br = new BufferedReader(new FileReader(fileName)); 

     while ((sCurrentLine = br.readLine()) != null) { 
      System.out.println(sCurrentLine); 
     } 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if (br != null)br.close(); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 
} 

此代碼將打印文件的內容,這是朝正確方向邁出的一步,但如何去讀每行?

因爲我不想養成將整個文件存儲在內存中的習慣。

我知道你可以將文本轉換與

parseInt() 

和類似的方法,但我只是想把我的頭周圍提取值。

+0

每個元素都在它自己的行嗎? (即'約翰'是在它自己的路線上,'史密斯'是在它自己的路線上,等等) – MadProgrammer

+0

是的,我認爲這會讓學習更容易。 – Jane

+0

如果項目在同一行上,您不必獲取字符串長度然後將其分開? – Jane

回答

4

你可以做這樣的事情......

while ((sCurrentLine = br.readLine()) != null) { 
    String firstName = sCurrentLine; 
    String lastName = br.readLine(); 
    String age = br.readLine(); 
    String dob = br.readLine(); 
} 

但是,這讓人頗爲有關文件要求的假設,它假定有每個條目4條線。

你可以將它自己的行中的每個條目,並使用deliminator將它們分開,例如

John;Smith;32;1991 

然後用類似...

while ((sCurrentLine = br.readLine()) != null) { 
    String parts[] = currentLine.split(";"); 
    String firstName = parts[0]; 
    String lastName = parts[1]; 
    String age = parts[2]; 
    String dob = parts[3]; 
} 

來讀取每個條目。這可以讓您對處理條目有更多的控制權,因爲您可以檢查parts數組的長度以驗證它具有期望值的數量。

一旦你得到了一個條目,你會想要一個更好的方式來管理每個條目,我會創建一個簡單的POJO持有的價值觀,也許像...

public class Person { 

    private final String fisrtName; 
    private final String lastName; 
    private final int age; 
    private final int dob; 

    public Person(String fisrtName, String lastName, int age, int dob) { 
     this.fisrtName = fisrtName; 
     this.lastName = lastName; 
     this.age = age; 
     this.dob = dob; 
    } 

    public String getFisrtName() { 
     return fisrtName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public int getAge() { 
     return age; 
    } 

    public int getDob() { 
     return dob; 
    } 

} 

然後您可能能夠使用ListMap來存儲它們,這將使其更易於管理...

List<Person> people = new ArrayList<>(25); 
//... 
while ((sCurrentLine = br.readLine()) != null) { 
    String parts[] = currentLine.split(";"); 
    String firstName = parts[0]; 
    String lastName = parts[1]; 
    String age = parts[2]; 
    String dob = parts[3]; 
    people.add(new Person(firstName, lastName, Integer.parseInt(age), Integer.parseInt(dob)); 
} 

另一種解決方案可能是使用一個Scanner,這將允許您使用nextnextInt來解析每個條目

因此,如果我們重新構造爲以下格式...

你可以簡單地使用

while ((sCurrentLine = br.readLine()) != null) { 
    Scanner scanner = new Scanner(sCurrentLine); 
    String firstName = scanner.next(); 
    String lastName = scanner.next(); 
    int age = scanner.nextInt(); 
    int dob = scanner.nextInt(); 
    people.add(new Person(firstName, lastName, age, dob); 
} 

代替

+0

感謝您的詳細回覆。您不僅通過提供替代方案回答了我的問題,而且更進一步。 – Jane

0

你也可以試試這個。

File file = new File("your file location"); 
    Scanner scan = new Scanner(file); 
    while(scan.hasNextLine()){ 
     //Assign to your pojo 
     System.out.println(scan.next()); 
    }