当前位置: 首页 > 知识库问答 >
问题:

如何以编程方式设置Repast文件接收器文件名?

缪嘉志
2023-03-14

有人知道是否有一种简单的方法可以根据模型中的一个字段使文件接收器的文件名元素路径成为变量吗?因此,而不是使用修复路径,例如:

修复了路径/文件名。csv

{variable_path}/filename。csv

共有1个答案

金谭三
2023-03-14

附加的ModelLaunalizer显示了如何执行此操作。我还复制了下面的代码,以防附件无法通过。要启用ModelLaunalizer,您需要将以下内容添加到scenario.xml文件中:

 <model.initializer class="PredatorPrey.MyInitializer" />

我在Predator Prey演示中测试了这一点,所以您应该更改类包名称。在ModelInitializer示例中,需要指定根上下文ID,该ID与上下文中的上下文ID相同。xml文件。您应该指定变量输出文件夹的名称。本例要求在文件接收器中指定一个文件名,就像通常那样,并插入变量路径。需要注意的是,如果场景保存在GUI中,则变量文件夹路径将保存在场景中,但此代码将检查任何现有路径,并用outputFolder字符串替换该路径。因此,您应该将整个路径放在outputFolder字符串中,而不仅仅是其中的一部分,或者根据需要更改代码行为。

package PredatorPrey;

import java.io.File;

import repast.simphony.data2.engine.FileSinkComponentControllerAction;
import repast.simphony.data2.engine.FileSinkDescriptor;
import repast.simphony.engine.controller.NullAbstractControllerAction;
import repast.simphony.engine.environment.ControllerAction;
import repast.simphony.engine.environment.RunEnvironmentBuilder;
import repast.simphony.engine.environment.RunState;
import repast.simphony.scenario.ModelInitializer;
import repast.simphony.scenario.Scenario;
import repast.simphony.util.collections.Tree;

public class MyInitializer implements ModelInitializer {

      @Override
      public void initialize(final Scenario scen, RunEnvironmentBuilder builder) {

            scen.addMasterControllerAction(new NullAbstractControllerAction() {

            String rootContextID = "Predator Prey";
            String outputFolder = "testoutfolder";

                  @Override
                  public void batchInitialize(RunState runState, Object contextId) {

                        Tree<ControllerAction> scenarioTree = scen.getControllerRegistry().getActionTree(rootContextID);

                        findFileSinkTreeChildren(scenarioTree, scenarioTree.getRoot(), outputFolder);

                        // Reset the scenario dirty flag so the changes made to the file sink 
                        //  descriptors don't prompt a scenario save in the GUI
                        scen.setDirty(false);

                  }

            });
      }

      public static void findFileSinkTreeChildren(Tree<ControllerAction> tree, 
                  ControllerAction parent, String outputFolder){

            // Check each ControllerAction in the scenario and if it is a FileSink,
            //    modify the output path to include the folder
            for (ControllerAction act : tree.getChildren(parent)){
                  if (act instanceof FileSinkComponentControllerAction){
                        FileSinkDescriptor descriptor = ((FileSinkComponentControllerAction)act).getDescriptor();
                        String fileName = descriptor.getFileName();

                        //  remove any prefix directories from the file name
                        int lastSeparatorIndex = fileName.lastIndexOf(File.separator);

                        // Check for backslash separator
                        if (fileName.lastIndexOf('\\') > lastSeparatorIndex)
                              lastSeparatorIndex = fileName.lastIndexOf('\\');

                        // Check for forward slash operator
                        if (fileName.lastIndexOf('/') > lastSeparatorIndex)
                              lastSeparatorIndex = fileName.lastIndexOf('/');

                        if (lastSeparatorIndex > 0){
                              fileName = fileName.substring(lastSeparatorIndex+1, fileName.length());
                        }

                        descriptor.setFileName(outputFolder + File.separator + fileName);
                  }
                  else findFileSinkTreeChildren(tree, act, outputFolder);
            }
      }
}
 类似资料:
  • 我习惯于用JavaFx编写如下所示的代码,因为这就是我几年前学习的方式。 我最近安装了JetBrains IntelliJ IDEA Ultimate Edition 2018.1.6,我发现要打开primaryStage窗口,我需要一个fxml文件。 我必须这么做, 如果我运行第一个代码片段,什么都不会显示。但是如果我用FXMLLoader.load(getClass(). getResourc

  • 如何在Spring Boot应用程序中设置活动配置文件。该应用程序将部署在独立的Tomcat中。 我有2个属性文件应用程序-{profile}。属性。

  • 问题内容: 我正在使用logback,并且尝试在Java程序中以编程方式设置日志文件名(类似于以编程方式设置LogbackAppender路径),并且我尝试按以下方法调整该解决方案: 在logback-test.xml中: 然后再次在我的Java程序中: 但是结果是两个日志,一个完整并按我的意愿命名,例如“ 1319041145343.log”,另一个为空并命名为“ log_file_name_I

  • 问题内容: 我想为Java的玩具语言编写一个编译器。我想生成可运行的.class文件。我想知道执行此操作的最佳库或工具是什么?我知道我可以学习所有指令的二进制格式并建立自己的常量池等,但这似乎应该已经完成​​:没必要重新发明轮子,对吗? 在线搜索我发现了两种不同的Java汇编语言Jasmin和Jamaica,但是只有Jasmin看起来有所维护。 是否存在用于将字节码写入流的Java库?这是Apac

  • 问题内容: 我有一个返回一个函数的包装函数。有没有办法以编程方式设置返回函数的文档字符串?如果可以写信,请执行以下操作: 那我可以做 但是,由于是只读的,所以我不能这样做。正确的方法是什么? 编辑:好的,我想保持这个简单,但是,这当然不是我真正想做的。即使就我而言通常是可写的,但事实并非如此。 我正在尝试自动创建测试用例。我有一个包装函数,该函数创建一个类对象,该类对象是的子类: 如果我创建此类并

  • 我是Android系统的新手。我得到了一个应用程序,在其中我列出了所有SD文件和文件夹,包括doc,pdf,xls,jpg等。 如何在Android中以编程方式获取我的SD卡中所有文件夹和文件的文件夹名和文件名? 我正在使用这段代码,但无法获得文件夹名称(根文件夹和子文件夹)。