从文件读入对象

时间:2016-11-09 00:17:28

标签: java string io bufferedreader

我希望能够获取文本文件的前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的对象,它会查看文本文件的前三行并获取街道名称,城市,国家,我将如何读取每一行并将它们设置为新Address对象的参数?

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

是我的示例构造函数。

2 个答案:

答案 0 :(得分:1)

您可以将这3行保留在String数组中,然后使用索引调用它们:

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] = city
  • 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的原因。

答案 1 :(得分:-1)

我建议您使用JSON或其他等效技术来序列化/反序列化java对象。