如何将包含整数和字符串的文本文件读入数组中

6
我已经读取了一个包含整数和字符串的文本文件,我需要使用所有四个信息来计算:

  1. 吞吐量
  2. 平均等待时间
  3. 平均周转时间
  4. 使用先来先服务和最短剩余时间处理器算法的操作系统的CPU空闲时间。(此外,页面错误作为字符串读入,但在文本文件中看起来像这样:"12, 7, 5, 79"

我应该使用什么样的数组来完成这个任务,该如何实现呢?这是我遇到困难的部分。

以下是我目前的进展:

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

public class TextFile {
    public static void main(String[] args) throws Exception {
        Scanner input = new Scanner(new File("JobQueue.txt"));

        String jobName;
        int arrivalTime;
        int cpuTime;
        String pageFault;

        while (input.hasNext()) {
            jobName = input.next();
            arrivalTime = input.nextInt();
            cpuTime = input.nextInt();
            pageFault = input.next();

            System.out.printf("\n%s %d %d %s\n", jobName, arrivalTime, cpuTime, pageFault);
        }
    }
}

编辑于04/22:
异常:

java.util.InputMismatchException
    at java.util.Scanner.throwFor(Unknown Source)
    at java.util.Scanner.next(Unknown Source)
    at java.util.Scanner.nextInt(Unknown Source)
    at java.util.Scanner.nextInt(Unknown Source)
    at TextFile.main(TextFile.java:18)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)

这是我目前编写的代码:

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

public class TextFile {
    public static void main(String[] args) throws Exception {
        Scanner input = new Scanner(new File("JobQueue.txt"));
        ArrayList<DataObject> list = new ArrayList<DataObject>();

        while (input.hasNext()) {
            String jobName = input.next();
            int arrival = input.nextInt();
            input.nextLine();
            int cpuTime = input.nextInt();
            input.nextLine();
            String inturrupt = input.next();

            DataObject data = new DataObject(jobName, arrivalTime, cpuTime, pageFault);
            list.add(data);
        }
    }
}

并且:

public class DataObject {
    private String jobName;
    private int arrivalTime;
    private int cpuTime;
    private String pageFault;

    public DataObject(String job, int arrival, int cpu, String interrupt) {
        jobName = job;
        arrivalTime = arrival;
        cpuTime = cpu;
        pageFault = interrupt;
    }

    public void setjobName(String job) {
        jobName = job;
    }

    public String getJobName() {
        return jobName;
    }

    public void setArrivalTime(int arrival) {
        arrivalTime = arrival;
    }

    public int getArrivalTime() {
        return arrivalTime;
    }

    public void setcpuTime(int cpu) {
        cpuTime = cpu;
    }

    public int getcpuTime() {
        return cpuTime;
    }

    public void setPageFault(String interrupt) {
        pageFault = interrupt;
    }

    public String getPageFault() {
        return pageFault;
    }

    public String toString() {
        return String.format("\n%s %d %d %s\n", getJobName(), getArrivalTime(), getcpuTime(), getPageFault());
    }
}

编辑 #2

import java.io.File;
import java.util.ArrayList;
import java.util.Scanner;
import java.io.IOException;

public class TextFile
 {
  public static void main(String[] args) throws IOException
  {
   Scanner input = new Scanner(new File("JobQueue.txt"));

   ArrayList<DataObject> list = new ArrayList<DataObject>(); 

   while(input.hasNext())
   {
    String jobName = input.next();
    int arrivalTime = input.nextInt();
    int cpuTime = input.nextInt();
    String pageFault = input.next();

    DataObject data = new DataObject(jobName, arrivalTime, cpuTime, pageFault);
    list.add(data);
   }
  }
 }

样例作业队列:

J1  0   90  "7,27,73,86"
J2  1   39  "12"
J3  2   195 "11,31,73,94,120,134,183"
J4  3   198 "7,25,57,83,112,138,190"
J5  4   103 "11,26,58,94"
J6  5   158 "15,39,63,79,120,144"
J7  6   168 "9,46,66,84,125,147"
3个回答

2

对于这个问题,数据库ORM风格的方法是创建一个代表文件中每一行的类:

public class RecordObject {
    private String jobName;
    private int arrivalTime;
    private int cpuTime;
    private String pageFault;

    public RecordObject(String jobName, int arrivalTime, int cpuTime, String pageFault) {
        this.jobName = jobName;
        this.arrivalTime = arrivalTime;
        this.cpuTime = cpuTime;
        this.pageFault = pageFault;
    }

    // getters and setters
}

接下来创建一个ArrayList,用于存储文件中任意数量的行:

ArrayList<RecordObject> list = new ArrayList<RecordObject>();

while(input.hasNext()) {           // <-- this is your original code
    jobName = input.next();
    arrivalTime = input.nextInt();
    cpuTime = input.nextInt();
    pageFault = input.next();

    RecordObject record = new RecordObject(jobName, arrivalTime, cpuTime, pageFault);
    list.add(record);
}

当你读完整个文件后,可以像这样遍历ArrayList

for (RecordObject record : list) {
    // compute throughput, average waiting time, etc...
}

我收到了一个输入不匹配异常。我将把我现在的代码以及错误发布到我的原始帖子中,我尝试研究可能出了什么问题,但没有运气,你能再次帮助我吗?谢谢。 - EchoJ
谢谢,编辑应该已经上传了。 - EchoJ
您当前在 TextFile 代码中的含义是 jobNamearrival 在一行上,cpuTime 是第二行,而 interrupt 则在第三行上。然而,您遇到的 InputMismatchException 可能是由于试图将 String 读取为 int 引起的。请发布您的输入文件 JobQueue.txt,以便我们查看。 - Tim Biegeleisen
最后一个问题,如果我需要提取某一列进行计算怎么办?(例如:cpuTime - arrivalTime)有没有一种方法可以从cpuTime列中提取所有500个条目和从arrivalTime列中提取所有500个条目,然后将其除以500? - EchoJ
要么编写自己的代码来迭代ArrayList,要么可以查看使用Apache Commons CollectionUtils包 - Tim Biegeleisen
显示剩余2条评论

1
这是解释为什么您会收到错误信息。请尝试以下方法:
//main
while (input.hasNext()) {
    String jobName = input.next();
    int arrival = input.nextInt(); // assumes this is your arrivalTime
    int cpuTime = input.nextInt();
    String inturrupt = input.next(); //assuming this is your pageFault

    DataObject data = new DataObject(jobName, arrival, cpuTime, inturrupt);
    list.add(data); 

    input.nextLine(); // advance input file to the next line
}

这段代码只有在读取每行的4个标记后才会推进输入文件。如果问题仍然存在,了解输入文件的一般情况也会很有帮助。


我认为这不会解决java.util.InputMismatchException - Tim Biegeleisen
我按照你发布的一些格式更改进行了修改,现在我要发布我的代码...我不再收到InputMismatchExcpetion错误,但我只是想确保它看起来正确。另外,有没有办法发布.txt文件,还是我只需要发布其中的一部分? - EchoJ
只需发布一小段,足以让我们了解意思。 - Alexander Sobin
我认为 CPU 时间和到达时间不是整数类型,但如果看不到输入文件就无法确定。 - Alexander Sobin

0

我真的不认为代码会有任何问题,只需检查文本文件中的输入以及它们如何与next()和nextInt()匹配即可。为了更安全起见,建议使用BufferedReader readLine(),然后进行行拆分。

    BufferedReader br=new BufferedReader(new FileReader("G:\\Codemagic\\sample01.txt"));

    String current_line=null;

    while((current_line=br.readLine())!=null)
    {
        current_line.split().do something with this
    }

这样你就知道每个字符串数组中有什么了


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接