Java,Maven-file覆盖数据,而不是将数据附加到数据中

Java,Maven-file覆盖数据,而不是将数据附加到数据中,java,maven,Java,Maven,我正在使用java、maven和cucumber进行测试。这是我定义的步骤。文件test.txt位于src/test/resources中。文件是空的 public void store_ids() { String id = currentScenarioData.scenarioContext.getScenarioContext("ID").toString(); try{ String savestr = get

我正在使用java、maven和cucumber进行测试。这是我定义的步骤。文件test.txt位于src/test/resources中。文件是空的

public void store_ids() {
        String id = currentScenarioData.scenarioContext.getScenarioContext("ID").toString();
        try{
            String savestr = getClass().getResource("/test.txt").getFile().toString();
            System.out.println("::: savestr :::" + savestr);
            File intentFile = new File(savestr);

            FileWriter fw = new FileWriter(intentFile, true);
            BufferedWriter bw = new BufferedWriter(fw);
            PrintWriter out = new PrintWriter(bw);

            if ( intentFile.isFile() && !intentFile.isDirectory() ) {
                System.out.println("::: FILE EXISTS :::"); // this works
                out.println(id + "\n");
            }
            else {
                fw = new FileWriter(intentFile);
            }
            out.close();
        } catch (Exception e) {
            System.out.println(e);
        }
    }
当我使用mvn clean运行测试用例时,请验证test.txt文件是否位于目标/测试类,并且它总是被新数据覆盖。src/test/resources处的原始文件仍然为空

如果我多次运行同一个测试用例,那么我应该在一个文件中写入多行数据。但是文件中的数据总是被覆盖,并且文件中只写入一个ID

我认为问题在于,当我使用mvn clean verify运行时,目标/测试类被删除并再次创建。我如何避免这种情况

更新 是的,在不使用clean的情况下运行mvn会将文件保存在目标/测试类中,我通过多次运行测试用例获得了多行数据。这是正确的方法吗

当我运行测试用例时,我应该将数据写入资源中的文件还是目标中的文件


关于maven和java,如何将数据追加到已经存在的文件中?

为了将文本追加到文件中,您需要使用FileWriter以追加模式打开文件,有一个特殊的构造函数,它接受布尔参数以追加模式打开文件

我可以在else块中看到,您并没有使用参数true调用FileWriter构造函数,这是在追加模式下打开文件所必需的

在java中向文件追加文本的步骤

通过传递true,在追加模式下使用FileWriter打开要追加文本的文件 如果要编写大文本,请将FileWriter包装到BufferedReader中 如果每次都要换行,请将PrintWriter换行 关闭finally块中的FileWriter以避免泄漏文件描述符 试试这个代码java6

FileWriter fw = null;
BufferedWriter bw = null; 
PrintWriter pw = null;
  try { 
      fw = new FileWriter("<path-to-file>", true); 
      bw = new BufferedWriter(fw); 
      pw = new PrintWriter(bw); 
      pw.println("Shane");
      pw.println("Root");
      pw.println("Ben");
      System.out.println("Data Successfully appended into file");
      pw.flush(); 
    } 
    finally { 
        try { 
            pw.close();
            bw.close(); 
            fw.close(); 
            } 
        catch (IOException io) {// can't do anything 
    }
 }
 
无论你在目标中写什么,都是暂时的,并且会在下一次mvn清理时被删除——这就是为什么它会被删除的原因。现在,如果您希望该文件用于测试目的,而该文件只是作为副作用产生的,并且以后不需要保留该文件,可以将其放在目标下,但是如果您希望收集一些报告或保留数据,则应将其放在目标之外

为什么它会在目标下生成?因为maven编译java源代码并将所有类放在该文件夹下,然后将其用作运行时类路径,所以生成的任何内容(如果没有绝对路径)都将相对于该位置生成

这条线

getClass.getResource/test.txt


表示-获取当前类及其位置,并在该位置下创建一个文件。现在,当然该类位于target/test类下,因此您的文件将如预期的那样位于target/test类/test.txt下

请澄清,您想在resource dir或target中写入文件吗?@ramazan resource中的文件为空,我想在运行testcases.clean命令删除目标文件夹时继续将数据附加到target中的文件中,您将无法使用所使用的命令将其保存在那里。您可以像这样运行:mvn验证,或者在targetI之外写入文件。我已经从internet上的另一个来源尝试过这种方法。问题是,如果我多次运行测试用例,我应该在一个文件中写入多行数据。但是每次我运行测试用例时,它都会被覆盖。是的,谢谢你的解释。所以,我应该把test.txt放在哪里,因为一旦它被数据填充,它将被用于其他测试用例中?在目标之外创建一个特殊的文件夹,并把它放在那里。它很可能是相对.././myfolder/test.txt的某种绝对路径。