【问题标题】:Read from file into an object从文件读入对象
【发布时间】:2016-11-09 00:17:27
【问题描述】:

我希望能够获取文本文件的前 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 test = new Address(String sname, String city, String country)

是我的示例构造函数。

【问题讨论】:

    标签: java string io bufferedreader


    【解决方案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] = 城市
    • 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 的原因。

    【讨论】:

    • 嗯,好的,谢谢!合并其他 3 行段有多难,所以如果有 21 行(7 个对象参数)我将如何合并它?只需创建一个字符串数组并找到循环的方法?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-04-03
      • 1970-01-01
      • 2013-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-26
      相关资源
      最近更新 更多