2014-01-08 69 views
0

我對編程相當新,我最近寫了一些東西來利用掃描儀類從文本文件中填充對象數組。從本質上講,我可以重寫這個文本文件或添加新的信息,而不必更改代碼。我想我的問題是這樣的:有沒有更容易/更喜歡的方法來做到這一點?我試圖學習編碼的細微差別。利用掃描儀來填充對象arraylist

import java.io.*; 
import java.util.*; 
public class ImportTest { 
public static void main(String[] args) throws IOException 
{ 
    Scanner s = null; 
    Scanner k = null; 
    ArrayList myList = new ArrayList<String>(); 
    ArrayList myList2 = new ArrayList<String>(); 
    ArrayList myList3 = new ArrayList<Student>(); 
    try 
    { 
     s = new Scanner(new BufferedReader(new FileReader("testMe.txt"))); 
     while (s.hasNext()) 
     { 
      myList.add(s.nextLine()); 
     } 
    } 
    finally 
    { 
     if (s != null) 
     { 
      s.close(); 
     } 
    } 
    System.out.println("My List 1:"); 
    for(int i=0; i<myList.size(); i++) 
    { 
     System.out.println(i+". "+myList.get(i)); 
    } 
    for(int x=0; x<myList.size(); x++) 
    { 
     try 
     { 
      k = new Scanner(myList.get(x).toString()); 
      while (k.hasNext()) 
      { 
       myList2.add(k.next()); 
      } 
     } 
     finally 
     { 
      if (k != null) 
      { 
       k.close(); 
      } 
     } 
     String name; 
     int age; 
     double money; 
     name=myList2.get(0).toString(); 
     age=Integer.parseInt(myList2.get(1).toString()); 
     money=Double.parseDouble(myList2.get(2).toString()); 
     Student myStudent=new Student(name, age, money); 
     myList3.add(myStudent); 
     myList2.clear(); 
    } 
    System.out.println("Test of list object: "); 
    for(int i=0; i<myList3.size(); i++) 
    { 
     System.out.println(i+". "+myList3.get(i).toString()); 
    } 
} 
} 

回答

0

糾正我,如果我錯了,testMe.txt文件包含有年齡,學生信息,並且要讀這些值。

最好的辦法是在ObjectOutputStream的幫助下,將您的學生對象序列化爲testMe.txt。您也可以使用ObjectInputStream來讀取這些值,因此您可以通過這種方式獲得Student對象本身(不需要使用String)。

如果您確實想要將數據序列化到文件中,則應該以某種預定義的格式(如逗號(,)或分號(;)分開存儲數據。

例如 -

emp1, 24, 20000 
emp emp2, 25, 24000 
emp3, 26, 26000 

在這種情況下,一邊看書,你可以與分離 - 性格分裂,並得到實際信息的字符串。

代碼片斷

List<Student> students = new ArrayList<Student>(); 
... 
try(scanner = new Scanner(new BufferedReader(new FileReader("testMe.txt")))){   
    while (scanner.hasNext()){ 
     String data[] = scanner.nextLine().split(","); 
     Student student = new Student(data[0],data[1],data[2]); 
     students.add(student); 
    } 
} 

Try-with-resource會自動處理的種源,你不需要明確地關閉它。這個功能自1.7以來在Java中可用。

1

我會逐行讀取文件,並直接解析每一行。這樣,你不需要3所列出,2臺掃描儀和多次迭代:

String line = ""; 
BufferedReader br = new BufferedReader(new FileReader("test.txt")); 
ArrayList<Student> students = new ArrayList<Student>(); 
while((line = br.readLine()) != null) 
{ 
    String[] tmp = line.split("\\s+"); //split line by spaces 

    //this needs bounds & error checking etc. 
    students.add(new Student(tmp[0], Integer.parseInt(tmp[1]), Double.parseDouble(tmp[2]))); 
} 

在Java 7中,可以使用new file functions一次閱讀完所有行:

List<String> allLines = Files.readAllLines("test.txt", Charset.defaultCharset()); 

不要忘記關閉閱讀器或使用try-with-resources(因爲Java 1.7)

+0

是的,在掃描儀while循環內部工作簡化了代碼,無需ArrayList。我必須警告,在循環內完成的任何繁重工作都可能會在大規模應用程序中造成I/O性能瓶頸。 –