我已经下载了SSJ库,这是一个用于随机模拟的Java库。其中一个文件需要打开* .dat文件。
我正在尝试运行下载的文件,并且dat文件也在那里,但我每次都会收到FileNotFoundException。
这是源代码:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.StringTokenizer;
import umontreal.iro.lecuyer.randvar.ExponentialGen;
import umontreal.iro.lecuyer.rng.MRG32k3a;
import umontreal.iro.lecuyer.rng.RandomStream;
import umontreal.iro.lecuyer.simevents.Event;
import umontreal.iro.lecuyer.simevents.Sim;
import umontreal.iro.lecuyer.simprocs.Resource;
import umontreal.iro.lecuyer.simprocs.SimProcess;
import umontreal.iro.lecuyer.stat.Tally;
public final class Jobshop {
int nbMachTypes; // Number of machine types M.
int nbTaskTypes; // Number of task types N.
double warmupTime; // Warmup time T_0.
double horizonTime; // Horizon length T.
boolean warmupDone; // Becomes true when warmup time is over.
Resource[] machType; // The machines groups as resources.
Jobshop.TaskType[] taskType; // The task types.
RandomStream streamArr = new MRG32k3a(); // Stream for arrivals.
BufferedReader input;
public Jobshop() throws IOException { readData(); }
// Reads data file, and creates machine types and task types.
void readData() throws IOException {
// input = new BufferedReader (new FileReader ("Jobshop.dat"));
input = new BufferedReader (new FileReader ("JobShop.dat"));
StringTokenizer line = new StringTokenizer (input.readLine());
warmupTime = Double.parseDouble (line.nextToken());
line = new StringTokenizer (input.readLine());
horizonTime = Double.parseDouble (line.nextToken());
line = new StringTokenizer (input.readLine());
nbMachTypes = Integer.parseInt (line.nextToken());
nbTaskTypes = Integer.parseInt (line.nextToken());
machType = new Resource[nbMachTypes];
for (int m=0; m < nbMachTypes; m++) {
line = new StringTokenizer (input.readLine());
String name = line.nextToken();
int nb = Integer.parseInt (line.nextToken());
machType[m] = new Resource (nb, name);
}
taskType = new Jobshop.TaskType[nbTaskTypes];
for (int n=0; n < nbTaskTypes; n++)
taskType[n] = new Jobshop.TaskType();
input.close();
}
class TaskType {
public String name; // Task name.
public double arrivalRate; // Arrival rate.
public int nbOper; // Number of operations.
public Resource[] machOper; // Machines where operations occur.
public double[] lengthOper; // Durations of operations.
public Tally statSojourn; // Stats on sojourn times.
// Reads data for new task type and creates data structures.
TaskType() throws IOException {
StringTokenizer line = new StringTokenizer (input.readLine());
statSojourn = new Tally (name = line.nextToken());
arrivalRate = Double.parseDouble (line.nextToken());
nbOper = Integer.parseInt (line.nextToken());
machOper = new Resource[nbOper];
lengthOper = new double[nbOper];
for (int i = 0; i < nbOper; i++) {
int p = Integer.parseInt (line.nextToken());
machOper[i] = machType[p-1];
lengthOper[i] = Double.parseDouble (line.nextToken());
}
}
// Performs the operations of this task (to be called by a process).
public void performTask (SimProcess p) {
double arrivalTime = Sim.time();
for (int i=0; i < nbOper; i++) {
machOper[i].request (1); p.delay (lengthOper[i]);
machOper[i].release (1);
}
if (warmupDone) statSojourn.add (Sim.time() - arrivalTime);
}
}
public class Task extends SimProcess {
Jobshop.TaskType type;
Task (Jobshop.TaskType type) { this.type = type; }
public void actions() {
// First schedules next task of this type, then executes task.
new Jobshop.Task (type).schedule (ExponentialGen.nextDouble
(streamArr, type.arrivalRate));
type.performTask (this);
}
}
Event endWarmup = new Event() {
public void actions() {
for (int m=0; m < nbMachTypes; m++)
machType[m].setStatCollecting (true);
warmupDone = true;
}
};
Event endOfSim = new Event() {
@Override
public void actions() { Sim.stop(); }
};
public void simulateOneRun() {
SimProcess.init();
endOfSim.schedule (horizonTime);
endWarmup.schedule (warmupTime);
warmupDone = false;
for (int n = 0; n < nbTaskTypes; n++) {
new Jobshop.Task (taskType[n]).schedule (ExponentialGen.nextDouble
(streamArr, taskType[n].arrivalRate));
}
Sim.start();
}
public void printReportOneRun() {
for (int m=0; m < nbMachTypes; m++)
System.out.println (machType[m].report());
for (int n=0; n < nbTaskTypes; n++)
System.out.println (taskType[n].statSojourn.report());
}
static public void main (String[] args) throws IOException {
Jobshop shop = new Jobshop();
shop.simulateOneRun();
shop.printReportOneRun();
}
}
以及输出:
Exception in thread "main" java.io.FileNotFoundException: JobShop.dat (O sistema não conseguiu localizar o ficheiro especificado)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileInputStream.<init>(FileInputStream.java:97)
at java.io.FileReader.<init>(FileReader.java:58)
at Jobshop.readData(Jobshop.java:31)
at Jobshop.<init>(Jobshop.java:26)
at Jobshop.main(Jobshop.java:133)
Java Result: 1
有关如何修复它的任何线索?
提前致谢。
答案 0 :(得分:3)
引用文件的方式,它希望在您运行应用程序的位置找到该文件。好像在那里找不到它。
答案 1 :(得分:2)
确保指定.dat文件相对于当前工作目录(运行java命令的目录)的路径。
答案 2 :(得分:0)
你的道路可能错了:
input = new BufferedReader (new FileReader ("JobShop.dat"));
答案 3 :(得分:0)
当我使用NetBeans IDE运行项目时,应将该文件添加到NetBeansProjects目录中的Main Project目录中。
当我在源包中创建它时,我不得不在打开文件时添加它的路径:
input = new BufferedReader (new FileReader ("src/JobShop.dat"));