2015-11-11 128 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()); 
    }