【问题标题】:Import Text File into an Array to create an object将文本文件导入数组以创建对象
【发布时间】:2016-03-23 10:14:44
【问题描述】:

我正在尝试使用文本文件将各种参数输入到数组中,然后使用该数组创建对象。文本文件中的每个留置权都有每个对象用逗号分隔的字符串和单个对象的单独行。

我似乎无法弄清楚我做错了什么,当我尝试调用加载文件的方法时,我不断收到此错误: "线程 "main" java.io.FileNotFoundException 中的异常:studentData.txt (系统找不到指定的文件)"

这是我的方法:

    public void loadStudent() throws FileNotFoundException{

    File inputFile = new File("studentData.txt");
    Scanner input = new Scanner(inputFile);
    try{
    while(input.hasNext()){
        String info = input.nextLine();
        String elements[] = info.split(" , ");
        String fName = elements[0];
        String lName = elements[1];
        String phone = elements[2];
        String address = elements[3];
        double gpa = Double.parseDouble(elements[4]);
        String major = elements[5];
        Student student = new Student(fName, lName, phone, address, 
                                          gpa, major);
        addStudent(student);
        input.nextLine();
        count++;
    }
    input.close();

    }catch(FileNotFoundException e){
        e.printStackTrace();
    }
}

【问题讨论】:

  • 你认为它不存在的地方。根据您的代码,它应该位于执行代码的同一目录中
  • 所以你是说文件名不正确?
  • 我是说,您认为您要查找的文件在哪里,它不是。尝试将System.out.println(new File(".").getCanonicalPath());System.out.println(System.getProperty("user.dir")); 添加到您的代码中,这将告诉您的程序是从哪里执行的,该文件应位于该目录中
  • 谢谢,我刚试过这个,我找到了文件所在的位置,但它不允许我把那个位置放进去,我收到一条红色下划线,上面写着“无效的转义序列(有效的转义序列是...等)”
  • 不,不要使用路径,将文件放在那个位置,Java 会读取它

标签: java arrays input text-files java-io


【解决方案1】:

好吧,你有两个选择...

选项 #01...

您可以将文件放在项目本身中,方法是将文件放在src 目录中。这会将文件嵌入到您的程序中,使其成为只读

(是的,我知道我使用的是 Netbeans,这个概念在 Eclipse 中是一样的)

如您所见,studentData.txtmyawesomeproject 中,在我的Main 类旁边。您在src 中的哪个位置放置确实很重要,所以请注意,如果文件不在同一个包中,那么您需要提供相对或完全限定的路径。

接下来,我们使用Scanner input = new Scanner(getClass().getResourceAsStream("studentData.txt"))打开文件,例如...

package myawesomeproject;

import java.io.FileNotFoundException;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        try {
            loadStudent();
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        }
    }

    public void loadStudent() throws FileNotFoundException {
        try (Scanner input = new Scanner(getClass().getResourceAsStream("studentData.txt"))) {
            while (input.hasNext()) {
                String info = input.nextLine();
                System.out.println(info);
                String elements[] = info.split(" , ");
                String fName = elements[0];
                String lName = elements[1];
                String phone = elements[2];
                String address = elements[3];
                double gpa = Double.parseDouble(elements[4]);
                String major = elements[5];

            }
        }
    }
}

在我的示例中,打印...

B1 , B2 , B3 , B4 , 0 , B6

(这是我文件的内容)

选项 #02...

您将文件放在“工作”目录中,这是执行程序的上下文,通常是项目目录(包含src 目录的目录)

那你就可以用Scanner input = new Scanner(new File("studentData.txt"))打开了,比如……

package myawesomeproject;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        try {
            loadStudent();
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        }
    }

    public void loadStudent() throws FileNotFoundException {
        try (Scanner input = new Scanner(new File("studentData.txt"))) {
            while (input.hasNext()) {
                String info = input.nextLine();
                System.out.println(info);
                String elements[] = info.split(" , ");
                String fName = elements[0];
                String lName = elements[1];
                String phone = elements[2];
                String address = elements[3];
                double gpa = Double.parseDouble(elements[4]);
                String major = elements[5];

            }
        }
    }
}

输出与上面相同的内容,因为我使用了相同的文件,只是为了示例移动了它

这确实假设您没有更改“工作”目录。如果您可以使用System.out.println(System.getProperty("user.dir")); 测试工作目录的位置,则可以将文件移动到此位置

【讨论】:

  • 谢谢,我相信这行得通,我不再收到该错误消息,除非现在当我尝试执行方法时,我得到这个:线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException: 1 在 finalProject.PeopleBag.loadStudent(PeopleBag.java:52) 在 finalProject.App.main(App.java:17)
  • 那你解析文件的方式不对,想到两件事,可能String elements[] = info.split(" , ");应该是String elements[] = info.split(",");,而且你也是双读文件,你有两个nextLine在您的while-loop中调用
  • 非常感谢我修复了这两个问题,现在它正在工作,你是我的英雄
【解决方案2】:

您得到的 FileNotFoundException 表明了名称的含义:JVM 无法在该位置找到文件。由于您指定的路径是相对的(不是绝对的),很可能它不是您认为的位置(相对于您所在的工作目录)。要解决此问题,您可以: a) 将文件路径更新为相对于您的应用程序正在运行的位置是正确的,或者 b) 指定输入文件的绝对路径

【讨论】:

  • 我已尝试输入确切的文件位置“C:\\Users\Andrew3\workspace\FinalProject\src\finalProject\studentData.txt”,但我收到一条错误消息,显示“转义序列无效(有效的是......等)“我知道这可能很愚蠢,但我似乎无法让它工作
猜你喜欢
  • 1970-01-01
  • 2015-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
  • 1970-01-01
  • 2021-01-19
相关资源
最近更新 更多