Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 需要帮助将文本文件读入对象吗_Java - Fatal编程技术网

Java 需要帮助将文本文件读入对象吗

Java 需要帮助将文本文件读入对象吗,java,Java,我创建了一个Person类,参数有firstname、lastname和year。我需要弄清楚如何从文本文件中读取输入并创建一个人员数组。以下是我正在尝试的,基于我从网上收集的不同来源 String name = "People.txt"; Person[] people = new ArrayList<Person>(); BufferedReader br = new BufferedReader(new FileReader(name));

我创建了一个Person类,参数有firstname、lastname和year。我需要弄清楚如何从文本文件中读取输入并创建一个人员数组。以下是我正在尝试的,基于我从网上收集的不同来源

String name = "People.txt";
        Person[] people = new ArrayList<Person>();
        BufferedReader br = new BufferedReader(new FileReader(name));
        String line = br.readLine();
        while(line != null)
        {
            people.add(line);
            line = br.readLine();
        }
好吧,亲爱的。你们真是太棒了,也许我今晚可以睡觉了。我已经连续两天试图完成这件事,开始产生幻觉。我遇到的最后一个问题,我确信它很简单,但我得到了这个错误

SortingImplementation.java:15: unreported exception java.io.FileNotFoundException; must be caught or declared to be thrown
                BufferedReader br = new BufferedReader(new FileReader("People.txt"));
                                                       ^
SortingImplementation.java:16: unreported exception java.io.IOException; must be caught or declared to be thrown
                String line = br.readLine();
我认为这可能与我实例化的方式有关,或者我没有导入正确的头文件。这是我进口的东西

import javax.swing.JOptionPane;
import java.util.*;
import java.util.ArrayList;
import java.util.Comparator;
import java.io.*;
import java.nio.*;
你们有没有发现什么可能遗漏的地方?

你们有两个选择

  • 在不更改
    Person
    类的情况下,在阅读该行之后,您可以将数据解析为
    firstName
    lastName
    age
    ,并将这些参数发送给构造函数
  • 您可以向
    Person
    添加一个构造函数,该构造函数需要一个未解析的
    字符串
    参数,并在构造函数中执行所有解析,并从中分配初始化变量
  • 有关如何执行任一选项的详细信息,您必须向我们显示文本文件的确切外观


    但目前的问题是,您试图将
    字符串
    对象添加到
    Person
    对象的
    数组列表

    您需要这样做:

    people.add(new Person(/*constructor arguments*/));
    

    现在您已经更新为包含文件格式,请尝试以下操作:

    while(line != null) {
        String[] lineParts = line.split("\\s+");
        people.add(new Person(lineParts[0],lineParts[1],parseInt(lineParts[2]));
        line = br.readLine();
    }
    
    while(line != null) {
        people.add(new Person(line));
        line = br.readLine();
    }
    

    通过一个额外的
    构造器进行操作也没什么不同

    Person
    类中,添加此构造函数:

    public Person(String s) {
        String[] parts = s.split("\\s+");
        this(parts[0], parts[1], parseInt(parts[2]));
    }
    
    然后在main中,使
    while
    循环如下所示:

    while(line != null) {
        String[] lineParts = line.split("\\s+");
        people.add(new Person(lineParts[0],lineParts[1],parseInt(lineParts[2]));
        line = br.readLine();
    }
    
    while(line != null) {
        people.add(new Person(line));
        line = br.readLine();
    }
    

    你不能仅仅添加一行
    字符串
    ,然后期望它神奇地变成
    。您需要将每一行拆分为单独的
    String
    s,然后从这些
    String

        Person[] people = new ArrayList<Person>();  
        BufferedReader br = new BufferedReader(new FileReader(name));
        String line = br.readLine();
        while(line != null)
        {
            people.add(line);
            line = br.readLine();
        }
    
    Person[]people=new ArrayList();
    BufferedReader br=新的BufferedReader(新文件读取器(名称));
    String line=br.readLine();
    while(行!=null)
    {
    添加(行);
    line=br.readLine();
    }
    
    您需要这样做,注意从array到
    ArrayList的更改

    ArrayList people=new ArrayList();//注意这里的变化
    BufferedReader br=新的BufferedReader(新文件读取器(名称));
    弦线;
    而((line=br.nextLine())!=null)
    {
    字符串[]标记=line.split(\\s+);
    字符串firstName=tokens[0];
    字符串lastName=tokens[1];
    int age=Integer.parseInt(标记[2]);//将字符串解析为int
    添加(新的人(名字、姓氏、年龄));
    }
    
    这是假设输入文本的格式如下

    名姓年龄


    另外,确保将所有内容包装在
    try/catch
    块中,或者让方法
    抛出IOException

    “不起作用”不是一个有用的描述。在阅读问题之前,我们知道它不起作用(否则你为什么会问任何问题?)文本文件是什么样子的?显示一个文本文件格式的示例。Ahhh!!!请快点回来!我很快就要完成了,但像这样的事情会让我盯着它好几个小时……我宁愿选择第一种。如果已经内置了某种解析功能,那就太棒了。你知道我怎么能分别阅读每一行的内容吗?你也有另一个打字错误,我只是帮你修好了。但在某些地方,他的姓氏和年龄之间似乎有额外的空格,因此
    代币[2]
    可能不一定有效<代码>令牌[tokens.size()-1]
    ?这就是\\s+的用途哦。。。您最初有
    。另外,由于我刚刚编辑到我的帖子中,您可能需要
    parseInt()
        ArrayList<Person> people = new ArrayList<Person>();  // Notice change here
        BufferedReader br = new BufferedReader(new FileReader(name));
        String line;
        while((line = br.nextLine()) != null)
        {
            String[] tokens = line.split("\\s+");
            String firstName = tokens[0];
            String lastName = tokens[1];
            int age = Integer.parseInt(tokens[2]);  // parse String to int
    
            people.add(new Person(firstName, lastName, age));
        }