如何从 Java 中的 .dat 文件中读取一行然后需要将其分开?

How do I read in a line from a .dat file in Java that then needs to be separated?

我正尝试在 TextPad 中使用 Java 读取 .dat 文件。 .dat 文件有多行代码,但每一行都有单独的信息片段,我需要这些信息用于我的主要方法和对象 类 中的不同方法。如何分离文件中提供的信息并将分离的部分输入到我的任何 类?

我知道如何从 .t​​xt 文件读取基本输入,但它不适用于 .dat 文件。我不知道如何分隔没有逗号的数据,而且我不允许更改.dat文件中的数据。

在 TextPad 中查看 .dat 文件时,它显示为标准字符,而不是二进制字符。我正在尝试阅读的代码如下:

1001Intro. to CompSci 4ALBERT, PETER A. Comp Info System A 1001Intro. to CompSci 4ALLENSON, SHEILA M. Comp Info System B 1001Intro. to CompSci 4ANDERSON, ALENE T. Comp Info System A 1001Intro. to CompSci 4HENDRIX, JAMES D. Lib Arts - MIS C 1001Intro. to CompSci 4CANNON, FREDDY B.B. Comp Info System B 1002Visual Basic 3ALBERT, PETER A. Comp Info System C 1002Visual Basic 3ALLENSON, SHEILA M. Comp Info System D 1002Visual Basic 3ANDERSON, ALENE T. Comp Info System A 1002Visual Basic 3HENDRIX, JAMES D. Lib Arts - MIS B 1002Visual Basic 3CANNON, FREDDY B.B. Comp Info System B 1003Cisco Networking I 4ALBERT, PETER A. Comp Info System C 1003Cisco Networking I 4ALLENSON, SHEILA M. Comp Info System A 1003Cisco Networking I 4ANDERSON, ALENE T. Comp Info System A 1003Cisco Networking I 4HENDRIX, JAMES D. Lib Arts - MIS D 1004Cisco Networking III3ALBERT, PETER A. Comp Info System B 1004Cisco Networking III3ALLENSON, SHEILA M. Comp Info System C 1004Cisco Networking III3ANDERSON, ALENE T. Comp Info System A 1004Cisco Networking III3CANNON, FREDDY B.B. Comp Info System B 1004Cisco Networking III3HELLER, HELEN H. Lib Arts - MIS A 1004Cisco Networking III3HENDRIX, JAMES D. Lib Arts - MIS F

下面以上面的第 1 行为例,对各个信息进行了标记:

CourseID CourseName Credits StudentName Major Grade

1001简介。 CompSci 4ALBERT, PETER A. Comp Info System A

File file = new File("xyz.dat");
Scanner scnr = new Scanner(file);
while(scnr.hasNextLine()){
   String line = scnr.nextLine();
   System.out.println(line);
}

没有简单的方法可以做到这一点,因为没有用于分隔字符串的定界符。尝试破解,比如如果数据以数字开头,那么它就是一个课程 ID,如果两个单词之间有一个逗号,那么它就是一个名字等等......

注意:这个答案假设每一列都是确定的长度(4位课程ID,20个字符的课程名称,1位学分,20个字符的学生姓名, 20字专业, 1位数成绩)

首先,您需要获取文件中每一行的列表。

String[] lines = Files.readAllLines(new File("myfile.dat").toPath()).toArray(new String[0]);

接下来,使用substring()方法处理每一行:

for(String line: lines) {
    int courseId = Integer.parseInt(line.substring(0, 4));
    String studentName = line.substring(4, 24).trim();
    // etc...
}

trim() 函数删除尾随空格。

我知道这个 post 已经有一个可接受的答案,但我只是想解决 OP 在他的评论中提出的一些其他问题。

下面我提供了 运行可用代码,演示了如何从多固定字段长度数据文件中检索数据。该代码基于@kittycat3141 提供的内容,因为这是处理这种特殊情况的方法(在我看来)。

Chris 在您的评论中记下了如何查找和检索数据,不仅针对所有学生,还针对特定学生。我在下面提供的代码示例就是通过使用 String.contains() 方法来实现的。通过使用此方法,我们可以使用完整的学生姓名或仅使用学生姓名的一部分。在进行学生搜索时,字母大小写也会被忽略,因为对于某些数据文件,大小写可能是驼峰式而不是全部大写,这在您的特定数据文件中似乎是这种情况。

运行nable class 利用 Scanner 对象从控制台收集用户输入的信息,涉及:数据文件的路径和文件名,显示所有学生,或特定学生的数据.如果未提供任何内容,则代码 运行-time 终止。输入在一个循环中,以便可以进行多个学生查询。

编写的代码易于理解。当您 运行 代码查看输出控制台并回答显示的提示时。这是代码。我希望有人觉得这有点用处:

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.Scanner;
import javax.swing.JOptionPane;

public class ReadDatFile {
    private static String[] dataLines;

    public static void main(String[] args) {
        Scanner userInput = new Scanner(System.in);
        String studentName = "";

        System.out.println("Please enter the path and file name to data file:");
        String filePath = userInput.nextLine();
        if ("".equals(filePath)) { System.exit(0); }
        fillDataArray(filePath);

        do {
            System.out.println("\nEnter 'ALL' to display all Student data or\n"
                             + "enter a Student name to return data for.\n"
                             + "(To exit enter nothing): -> ");
            studentName = userInput.nextLine();
            if ("".equals(studentName)) { System.exit(0); }
            if ("all".equals(studentName.toLowerCase())) {
                displayAllStudents();
            }
            else { 
                displayStudent(studentName); 
            }
        } while (!"".equals(studentName));
    }

    private static void fillDataArray(String fileName) {
        try {
            dataLines = Files.readAllLines(new File(fileName).toPath()).toArray(new String[0]);
        } catch (IOException ex) {
            JOptionPane.showMessageDialog (null, "Error Accessing The Data File "
                    + "Indicated Below!\n\n" + fileName + "\n\n" + ex.getMessage(), 
                    "FillDataArray() Method Error", JOptionPane.ERROR_MESSAGE);
            System.exit(0);
        }
    }

    private static void displayAllStudents() {
        System.out.println("**************  ALL STUDENTS  ***************");
        for (int i = 0; i < dataLines.length; i++) {
            String courseID = dataLines[i].substring(0, 4).trim();
            String courseName = dataLines[i].substring(4, 24).trim();
            String courseCredit = dataLines[i].substring(24, 25).trim();
            String studName = dataLines[i].substring(25, 45).trim();
            String studMajor = dataLines[i].substring(45, 65).trim();
            String studGrade = dataLines[i].substring(65, 66).trim();

            System.out.println("Student Name : " + studName);
            System.out.println("Course ID    : " + courseID);
            System.out.println("Course Name  : " + courseName);
            System.out.println("Course Credit: " + courseCredit);
            System.out.println("Student Major: " + studMajor);
            System.out.println("Student Grade: " + studGrade);
            System.out.println("---------------------------------------------");
        }
        System.out.println("***********  END OF STUDENT DATA  ***********");

    }

    private static void displayStudent(String studentName) {
        System.out.println("********* COURSE DATA FOR " + studentName + " *********");
        ArrayList<String> student = new ArrayList<>();
        for (int i = 0; i < dataLines.length; i++) {
            String studName = dataLines[i].substring(25, 45).trim().toLowerCase();
            if (studName.contains(studentName.toLowerCase())) {
                student.add(dataLines[i]);
            }
        }    

        for (int i = 0; i < student.size(); i++) {
            String courseID = student.get(i).substring(0, 4).trim();
            String courseName = student.get(i).substring(4, 24).trim();
            String courseCredit = student.get(i).substring(24, 25).trim();
            String studName = student.get(i).substring(25, 45).trim();
            String studMajor = student.get(i).substring(45, 65).trim();
            String studGrade = student.get(i).substring(65, 66).trim();

            System.out.println("Student Name : " + studName);
            System.out.println("Course ID    : " + courseID);
            System.out.println("Course Name  : " + courseName);
            System.out.println("Course Credit: " + courseCredit);
            System.out.println("Student Major: " + studMajor);
            System.out.println("Student Grade: " + studGrade);
            System.out.println("---------------------------------------------");
        }
        System.out.println("***********  END OF STUDENT DATA  ***********");
    }
}