2016-11-09 74 views
0

我希望能夠獲取文本文件的前3行,並將每行用作單獨的參數。例如:從文件讀入對象

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Scanner; 
    try { 
       File file = new File("test.txt"); 
       FileReader fileReader = new FileReader(file); 
       BufferedReader bufferedReader = new BufferedReader(fileReader); 
       StringBuffer stringBuffer = new StringBuffer(); 
       String line; 
       while ((line = bufferedReader.readLine()) != null) { 
        stringBuffer.append(line); 
        stringBuffer.append("\n"); 
       } 
       fileReader.close(); 
       System.out.println("Contents of file:"); 
       System.out.println(stringBuffer.toString()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

這是如何我目前從文件中讀取,所以如果我有一個名爲地址的對象,着眼於前三行一個文本文件中,並得到街道名稱,城市,國家,我將如何讀每行並將它們設置爲新地址對象的參數?

Address test = new Address(String sname, String city, String country) 

是我的示例構造函數。

回答

1

你可以保持在一個String陣列的3線,然後打電話給他們使用指數:

public static void main(String[] args) { 
    try { 
     File file = new File("test.txt"); 
     FileReader fileReader = new FileReader(file); 
     BufferedReader bufferedReader = new BufferedReader(fileReader); 
     String[] lines = new String[3]; 
     int i = 0; 
     while ((lines[i] = bufferedReader.readLine()) != null) { 
      if (i == 2) { 
       break; 
      } 
      i++; 
     } 
     fileReader.close(); 
     Address test = new Address(lines[0], lines[1], lines[2]); 
     // do something with test 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

其中

  • lines[0] =街道名稱
  • lines[1] =城市
  • lines[2] =國家

根據您的意見,如果你想有多個地址:

public static void main(String[] args) { 
    try { 
     BufferedReader br = new BufferedReader(new FileReader(new File("test.txt"))); 
     List<Address> addresses = new ArrayList<>(); 
     List<String> lines = new ArrayList<>(); 
     String line; 
     while ((line = br.readLine()) != null) { 
      lines.add(line); 
     } 
     int noOfAddresses = lines.size() - lines.size() % 3; 
     for (int i = 0; i < noOfAddresses; i += 3) { 
      addresses.add(new Address(lines.get(i), lines.get(i + 1), lines.get(i + 2))); 
     } 
     // do something with addresses 
     // (Example - print them, if you defined toString in Address class) 
     for (int i = 0 ; i < addresses.size() ; i++) { 
      System.out.println(addresses.get(i)); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

步驟:

  1. 創建將存儲線(lines
  2. 創建一個新的列表一個新的清單,將存儲Address對象(addresses
  3. 閱讀所有行,並將它們添加到lines列表中。
  4. 也許這條線是棘手:

    int noOfAddresses = lines.size() - lines.size() % 3; 
    

    它忽略,如果你想有一個正確的地址(無null街道,城市和國家)不需要的最後0,1或2行。

  5. 然後,前3行用於第一個地址,接下來的3行用於第二個地址等。這就是爲什麼我在那裏使用i += 3的原因。

+0

嗯,好的謝謝!加入其他3條線段會有多難,所以如果有21條線條(7個對象參數),我將如何加入?只需創建一個字符串數組並找到一種方法來循環呢? – HaffCaff

-1

我建議你使用JSON或其他等效技術來對java對象進行序列化/反序列化。