简体   繁体   中英

java.io.FileNotFoundException, why?

I have downloaded the SSJ library, a Java library for stochastic simulation. One of the files needs to open a *.dat file.

I am trying to run the file as downloaded, and the dat file is also there but I get the FileNotFoundException everytime.

Here's the source code:

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();
}
}

and here's the output:

 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

Any clue on how to fix it?

Thanks in advance.

The way the file is referred, it expects to find the file in the location where you run the application from. It seems like it cannot find it there.

确保相对于当前工作目录(运行java命令的目录)指定.dat文件的路径

您的路径可能是错误的:

input = new BufferedReader (new FileReader ("JobShop.dat"));

As I am using NetBeans IDE to run the project, the file should be added to the Main Project directory inside the NetBeansProjects dir.

As I was creating it inside the source packages, I had to add it's path when opening the file as such:

input = new BufferedReader (new FileReader ("src/JobShop.dat"));

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM