从文件读取-Java

从文件读取-Java,java,io,filereader,Java,Io,Filereader,我正在从事一个项目,我需要从文件中读取文本,然后将特定部分存储为变量 假设我有文本文件example.txt John Smith 32 1991 我希望将第一行指定为: String firstName; -> John 等等 到目前为止,我有这个 public void load(String fileName){ BufferedReader br = null; try { String sCurrentLine; br =

我正在从事一个项目,我需要从文件中读取文本,然后将特定部分存储为变量

假设我有文本文件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()

和类似的方法,但我只是想了解提取值的方法。

你可以做一些类似于

while ((sCurrentLine = br.readLine()) != null) {
    String firstName = sCurrentLine;
    String lastName = br.readLine();
    String age = br.readLine();
    String dob = br.readLine();
}
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];
}
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;
    }

}
但这对文件要求做出了相当大的假设,它假设每个条目有4行

例如,您可以将每个条目放在它自己的行上,并使用除沫器将它们分开

John;Smith;32;1991
然后使用类似于

while ((sCurrentLine = br.readLine()) != null) {
    String firstName = sCurrentLine;
    String lastName = br.readLine();
    String age = br.readLine();
    String dob = br.readLine();
}
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];
}
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;
    }

}
阅读每个条目。这使您对条目的处理有了更多的控制,因为您可以检查
部分的长度
数组,以验证它是否具有预期值的数量

一旦你有了一个条目,你会想要一个更好的方法来管理每个条目,我会创建一个简单的POJO来保存这些值,可能类似于

while ((sCurrentLine = br.readLine()) != null) {
    String firstName = sCurrentLine;
    String lastName = br.readLine();
    String age = br.readLine();
    String dob = br.readLine();
}
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];
}
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;
    }

}
然后,您可能可以使用
列表
映射
来存储它们,这将更容易管理

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));
}
你可以简单地使用

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);
}
相反,你也可以试试这个

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

每个元素都在自己的行中吗?(例如,
John
在自己的线上,
Smith
在自己的线上等等)是的,我认为这会让学习更容易。如果项目在同一行,你不需要得到字符串长度然后将其分开吗?如果它们在一行上,你可以使用消除器将它们分开,然后使用
String#split
,但这取决于你谢谢你的详细回答。你不仅回答了我的问题,还提供了更多的选择。