2016-11-09 70 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对象进行序列化/反序列化。