2015-11-11 2 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; 
    } 

} 

Тогда вы могли бы быть в состоянии использовать List или Map для их хранения, что позволит сделать его легче управлять ...

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, что позволит вам использовать next и nextInt для анализа каждой записи

Итак, если мы перестроим следующий формат ...

Вы могли бы просто использовать

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